<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>yevdev◡̈</title>
    <link>https://yexjinitlog.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 25 May 2026 13:23:24 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>yevdev</managingEditor>
    <image>
      <title>yevdev◡̈</title>
      <url>https://tistory1.daumcdn.net/tistory/4891453/attach/3069546b0b554fa99c380fed5cc26244</url>
      <link>https://yexjinitlog.tistory.com</link>
    </image>
    <item>
      <title>[AWS] ALB로 EC2 인스턴스 번갈아 접속하기</title>
      <link>https://yexjinitlog.tistory.com/177</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zM9uj/btrYhbpCtIT/fkzxfAFbDCyBsLnHogg5SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zM9uj/btrYhbpCtIT/fkzxfAFbDCyBsLnHogg5SK/img.png&quot; data-alt=&quot;구성할 아키텍처&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zM9uj/btrYhbpCtIT/fkzxfAFbDCyBsLnHogg5SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzM9uj%2FbtrYhbpCtIT%2FfkzxfAFbDCyBsLnHogg5SK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;2134&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2134&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;구성할 아키텍처&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;1️⃣ VPC 생성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VPC&lt;/b&gt; : 가상 사설망&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czfxy0/btrYjfyi7YK/qqdVG2WB29GmrvkvKZvhzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czfxy0/btrYjfyi7YK/qqdVG2WB29GmrvkvKZvhzK/img.png&quot; data-alt=&quot;CIDR 표기법으로 해당 네트워크 영역을 지정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czfxy0/btrYjfyi7YK/qqdVG2WB29GmrvkvKZvhzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fczfxy0%2FbtrYjfyi7YK%2FqqdVG2WB29GmrvkvKZvhzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;842&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CIDR 표기법으로 해당 네트워크 영역을 지정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;2️⃣ Subnet 생성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;subnet&lt;/b&gt; &lt;/span&gt;: 서브넷은 VPC의 IP 주소 범위이다. VPC 안에 서브넷을 여러 개 추가하여 내부를 논리적으로 쪼갠다. Subnet은 각 AZ에서 Public subnet 하나와 Private 서브넷 하나로 나눈다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dM8TWL/btrYjWLNjdK/hl202glTXyn6ApqkwJjXK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dM8TWL/btrYjWLNjdK/hl202glTXyn6ApqkwJjXK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dM8TWL/btrYjWLNjdK/hl202glTXyn6ApqkwJjXK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdM8TWL%2FbtrYjWLNjdK%2Fhl202glTXyn6ApqkwJjXK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;371&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;3️⃣ IGW 생성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Public 서브넷은 외부에서 내부로의 접근이 가능해야 한다. 이는 &lt;i&gt;Internet Gateway: IGW&lt;/i&gt;와 연결하여 Private 서브넷으로 들어오고 나갈 수 있는 통로가 되도록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서&lt;b&gt; IGW는 EC2 인스턴스와 인터넷 사이 통신을 가능하도록 하는 역할&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 트래픽이 외부에서 들어오고 외부로 나가는 것을 가능하게 하는 역할&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JsZLb/btrYjEkhknZ/d1eCAp6jrLraV5bczbKkPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JsZLb/btrYjEkhknZ/d1eCAp6jrLraV5bczbKkPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JsZLb/btrYjEkhknZ/d1eCAp6jrLraV5bczbKkPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJsZLb%2FbtrYjEkhknZ%2Fd1eCAp6jrLraV5bczbKkPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;579&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;4️⃣ Routing Table 생성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 통신이 이루어질 때, 데이터들은 라우터를 거쳐가게 된다. 라우터는 해당 데이터들의 경로를 지정해주는 역할을 하고, 경로들을 라우팅 테이블에 저장시킨다. 데이터들은 라우팅 테이블의 저장되어있는 경로를 따라 원하는 목적지를 찾아가게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Routing-table for Public-subnet&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 트래픽이 IGW를 통해 외부와 연결됨을 확인&lt;/li&gt;
&lt;li&gt;두개의 Public-subnet과 연결됨을 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Routing-table for Private-subnet&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두개의 Private-subnet과 연결됨을 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;814&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf1363/btrYhaK2mtL/LAw4y1WUpfyeMInjgGWVo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf1363/btrYhaK2mtL/LAw4y1WUpfyeMInjgGWVo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf1363/btrYhaK2mtL/LAw4y1WUpfyeMInjgGWVo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf1363%2FbtrYhaK2mtL%2FLAw4y1WUpfyeMInjgGWVo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;814&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;⛔️ Public Routing-table에 0.0.0.0/0 열어주기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이거 때문에 ssh 접속이 되지 않았었음&lt;/li&gt;
&lt;li&gt;0.0.0.0/0 = 모든 IP, 네트워크에 액세스할 수 있는 곳이면 어디에서나 접근 가능을 의미
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라우팅 테이블에서 사용되는 경우, 기본 게이트웨이를 식별하는데 0.0.0.0에 대한 경로가 기본 경로&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;791&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nnsx7/btrYjfZpZnM/m8f4Hn0JRzpAvNjKJKP6m0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nnsx7/btrYjfZpZnM/m8f4Hn0JRzpAvNjKJKP6m0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nnsx7/btrYjfZpZnM/m8f4Hn0JRzpAvNjKJKP6m0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnnsx7%2FbtrYjfZpZnM%2Fm8f4Hn0JRzpAvNjKJKP6m0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;791&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;791&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0d22W/btrYkFwfscG/qFwj8pTqj3nChEoU6MRkk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0d22W/btrYkFwfscG/qFwj8pTqj3nChEoU6MRkk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0d22W/btrYkFwfscG/qFwj8pTqj3nChEoU6MRkk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0d22W%2FbtrYkFwfscG%2FqFwj8pTqj3nChEoU6MRkk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;420&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;서브넷 연결&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pub, prv 라우팅테이블에 해당하는 서브넷 연결&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmsk7a/btrX8h5keT0/uPu3MLl7gT7aVK8bBzGqh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmsk7a/btrX8h5keT0/uPu3MLl7gT7aVK8bBzGqh1/img.png&quot; data-alt=&quot;Public 도 마찬가지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmsk7a/btrX8h5keT0/uPu3MLl7gT7aVK8bBzGqh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdmsk7a%2FbtrX8h5keT0%2FuPu3MLl7gT7aVK8bBzGqh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;842&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Public 도 마찬가지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;VPC에 IGW연결&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;841&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rq0wi/btrYfZJzHLy/15J15CwUzchKD0Qz2m98EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rq0wi/btrYfZJzHLy/15J15CwUzchKD0Qz2m98EK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rq0wi/btrYfZJzHLy/15J15CwUzchKD0Qz2m98EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frq0wi%2FbtrYfZJzHLy%2F15J15CwUzchKD0Qz2m98EK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;210&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;841&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBRrEN/btrYjzwwHZh/oHvpYPnvYHMTvzaZogaT81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBRrEN/btrYjzwwHZh/oHvpYPnvYHMTvzaZogaT81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBRrEN/btrYjzwwHZh/oHvpYPnvYHMTvzaZogaT81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBRrEN%2FbtrYjzwwHZh%2FoHvpYPnvYHMTvzaZogaT81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;539&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;5️⃣ ALB, WAS, WEB 서버를 위한 보안그룹 생성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;996&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eiUYmC/btrYkKYA0eK/IE8r1oz50k4V6mCX49A6aK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eiUYmC/btrYkKYA0eK/IE8r1oz50k4V6mCX49A6aK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eiUYmC/btrYkKYA0eK/IE8r1oz50k4V6mCX49A6aK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeiUYmC%2FbtrYkKYA0eK%2FIE8r1oz50k4V6mCX49A6aK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;996&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;996&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 접속이므로 HTTP 유형 80 포트로 모두 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSH 접속이 가능하도록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;⛔️ 내 IP가 바뀔경우, SSH 접속 불가&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안그룹 다시 설정해줘야함!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;6️⃣ EC2 인스턴스 생성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;EC2&lt;/b&gt;&lt;/span&gt; : 클라우드의 가상서버&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;  WEB 서버&lt;/b&gt; - 정적인 컨텐츠 (HTML, CSS, Image 등)을 요청받아 처리 &lt;br /&gt;&lt;b&gt;  WAS 서버&lt;/b&gt; - 동적인 컨텐츠 (JSP, ASP, PHP 등)을 요청받아 처리 - WEB 서버와 DBMS 사이에서 동작하는 미들웨어로써, 컨테이너 기반으로 동작&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-size: 1.25em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;1. 키페어 생성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. WEB VM 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VGdIx/btrYiV07QNF/Jv1rknRKCPzSYaJiigJZTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VGdIx/btrYiV07QNF/Jv1rknRKCPzSYaJiigJZTK/img.png&quot; data-alt=&quot;WEB1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VGdIx/btrYiV07QNF/Jv1rknRKCPzSYaJiigJZTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVGdIx%2FbtrYiV07QNF%2FJv1rknRKCPzSYaJiigJZTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1140&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1140&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WEB1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JLLot/btrYic9Hsjf/MrXEobK6wA0ekFsJNkxuzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JLLot/btrYic9Hsjf/MrXEobK6wA0ekFsJNkxuzK/img.png&quot; data-alt=&quot;WEB2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JLLot/btrYic9Hsjf/MrXEobK6wA0ekFsJNkxuzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJLLot%2FbtrYic9Hsjf%2FMrXEobK6wA0ekFsJNkxuzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1190&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1190&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WEB2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;  t3a.micro&lt;/b&gt;&lt;br /&gt;- 프리티어를 쓰는 경우에는 t2 계열의 인스턴스가 추천되지만, 프리티어를 쓰는게 아니라면 성능, 비용 절감의 효과에 따라 t3 계열 인스턴스가 더 추천된다. &lt;br /&gt;- t3계열의 경우 t3와 t3a가 나눠지는데, 두 계열 성능은 크게 다르지 않고 가격은 t3a가 더 싸다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;7️⃣ ALB 생성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;ALB&lt;/span&gt; ?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OSI 모델의 7계층인 애플리케이션 계층에서 작동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서비스에 걸리는 부하를 분산해주는 로드 밸런서 &amp;rarr; 안정성과 고가용성을 높임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP(웹 서버) 접속을 분산시키기 위해 ALB 생성&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. target group 구성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;963&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byKo2L/btrYkE5bkSA/jovgDdc09SKR6W8kvMaxA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byKo2L/btrYkE5bkSA/jovgDdc09SKR6W8kvMaxA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byKo2L/btrYkE5bkSA/jovgDdc09SKR6W8kvMaxA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyKo2L%2FbtrYkE5bkSA%2FjovgDdc09SKR6W8kvMaxA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;963&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;963&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. ALB 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biwLv4/btrYiVGOAW2/Etugg1Gl6fj7hH9nGXlzL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biwLv4/btrYiVGOAW2/Etugg1Gl6fj7hH9nGXlzL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biwLv4/btrYiVGOAW2/Etugg1Gl6fj7hH9nGXlzL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiwLv4%2FbtrYiVGOAW2%2FEtugg1Gl6fj7hH9nGXlzL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1558&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Scheme 설정&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LB를 생성하면 선택한 Subnet에 LB Node가 생성된다.&lt;/li&gt;
&lt;li&gt;인터넷을 통해 웹 서버에 접근해야하는 경우, Private Subnet을 선택해버리면 Load Balancer Node가 Private Subnet에 생성되기 때문에 외부와 통신할 수 없는 상황이 발생하여 웹 서버에 접근할 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clXev6/btrYdhDHFbN/c0dOQpbniUIoQ27tbfbPak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clXev6/btrYdhDHFbN/c0dOQpbniUIoQ27tbfbPak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clXev6/btrYdhDHFbN/c0dOQpbniUIoQ27tbfbPak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclXev6%2FbtrYdhDHFbN%2Fc0dOQpbniUIoQ27tbfbPak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1169&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1169&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l0GbO/btrYf0hsn0m/YM1dCINkE1NGI6uQK3GBnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l0GbO/btrYf0hsn0m/YM1dCINkE1NGI6uQK3GBnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l0GbO/btrYf0hsn0m/YM1dCINkE1NGI6uQK3GBnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl0GbO%2FbtrYf0hsn0m%2FYM1dCINkE1NGI6uQK3GBnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1488&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMZsdz/btrYidtZfFX/jyqkOYOdbrDgMMKIxAjG20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMZsdz/btrYidtZfFX/jyqkOYOdbrDgMMKIxAjG20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMZsdz/btrYidtZfFX/jyqkOYOdbrDgMMKIxAjG20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMZsdz%2FbtrYidtZfFX%2FjyqkOYOdbrDgMMKIxAjG20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;402&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;8️⃣ 테스트 및 결과&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ALB를 만들고 EC2와 연결됨을 확인하는 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;web1, web2 인스턴스 둘다 각각 &lt;b&gt;ssh 접속 및 nginx 설치 및 실행&lt;/b&gt;을 진행&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. ssh 접속&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;ssh -i [키페어 파일 경로] [username]@[인스턴스 public ip주소]

# ssh -i &quot;lena-key.pem&quot; ubuntu@3.34.97.134
ssh -i &quot;lena-key.pem&quot; ubuntu@3.36.130.208&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. nginx 설치 및 실행&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# nginx 설치
sudo apt install nginx

# nginx 시작
sudo service nginx start

# 시작 상태 확인
sudo service nginx status&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. public ip로 접속하여 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSmkzp/btrYidneKHa/eJ6jkbmA6ys1mKeImxHrYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSmkzp/btrYidneKHa/eJ6jkbmA6ys1mKeImxHrYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSmkzp/btrYidneKHa/eJ6jkbmA6ys1mKeImxHrYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSmkzp%2FbtrYidneKHa%2FeJ6jkbmA6ys1mKeImxHrYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;553&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. ALB로 접속하여 확인&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ALB가 정상적으로&lt;b&gt; active&lt;/b&gt;되는지 확인 (provisioning &amp;rarr; active)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFw8gr/btrYjzJ4uvL/SIviF5qQiYL4TiqSMkmN10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFw8gr/btrYjzJ4uvL/SIviF5qQiYL4TiqSMkmN10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFw8gr/btrYjzJ4uvL/SIviF5qQiYL4TiqSMkmN10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFw8gr%2FbtrYjzJ4uvL%2FSIviF5qQiYL4TiqSMkmN10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;385&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;385&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;표시된 DNS로 접속&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LcRub/btrYjfZqEPQ/ikLKviay03pjhAddBDsFj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LcRub/btrYjfZqEPQ/ikLKviay03pjhAddBDsFj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LcRub/btrYjfZqEPQ/ikLKviay03pjhAddBDsFj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLcRub%2FbtrYjfZqEPQ%2FikLKviay03pjhAddBDsFj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;544&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로고침할때마다 동일한 DNS에서 web1, web2 인스턴스가 번갈아가며 접속되어짐&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Cloud + Infra</category>
      <category>alb</category>
      <category>AWS</category>
      <category>EC2</category>
      <category>IGW</category>
      <category>nginx</category>
      <category>routing</category>
      <category>ssh</category>
      <category>VPC</category>
      <author>yevdev</author>
      <guid isPermaLink="true">https://yexjinitlog.tistory.com/177</guid>
      <comments>https://yexjinitlog.tistory.com/177#entry177comment</comments>
      <pubDate>Mon, 6 Feb 2023 16:30:48 +0900</pubDate>
    </item>
    <item>
      <title>[Node] package.json과 node-modules</title>
      <link>https://yexjinitlog.tistory.com/176</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;package.json&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;설치한 패키지 버전을 관리&lt;/b&gt;하는 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;노드 프로젝트를 시작하기 전&lt;/b&gt;에 폴더 내부에 무조건 package.json을 만들고 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #f6e199;&quot;&gt;scripts&lt;/span&gt; : npm 명령어를 저장해두는 부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;npm run [스크립트 명령어]&lt;/span&gt; : 해당 명령어가 실행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;npm install [패키지 이름]&lt;/span&gt; : package.json이 저장된 폴더 위치에서 패키지 설치&amp;nbsp; (npm install express)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #f6e199;&quot;&gt;dependencies&lt;/span&gt; : 의존관계에 있는 패키지들이 모여 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #f6e199;&quot;&gt;devDependencies&lt;/span&gt; : 개발용 패키지들&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;nodemon&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&amp;nbsp;소스코드가 바뀔때마다 자동으로 노드를 실행시켜주는 개발용 패키지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;node-modules &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 설치한 패키지들이 모여있는 폴더&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Express 하나만 설치했는데 express가 &lt;b&gt;의존하는 다른 여러 패키지들&lt;/b&gt;도 들어있음 &amp;rarr; 이를 깔끔히 정리해주기 위해 package.json이 필요한 것!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- package.json에 설치한 패키지 내역들이 들어있으므로 &lt;b&gt;보관할 필요가 없는 폴더&lt;/b&gt;임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;npm install&lt;/span&gt;만 하면 알아서 다시 설치됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;package-lock.json&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 직접 설치한 패키지(ex. express)외의 &lt;b&gt;해당 패키지가 의존하고 있는 여러 패키지들의 정확한 버전과 서로간의 의존관계&lt;/b&gt;가 담김&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  패키지 전역 설치&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- rimraf 설치 코드 : &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;npm&amp;nbsp;install --global rimraf&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- package.json에 기록되지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- mac이나 Linux는 전역 설치시에 관리자 권한이 필요하므로 &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;sudo npm&amp;nbsp;install --global rimraf&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Reference&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- Node.js 교과서 개정 2판&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;reaction-174&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Node.js</category>
      <category>node</category>
      <category>node-modules</category>
      <category>node.js</category>
      <category>package-lock.json</category>
      <category>package.json</category>
      <author>yevdev</author>
      <guid isPermaLink="true">https://yexjinitlog.tistory.com/176</guid>
      <comments>https://yexjinitlog.tistory.com/176#entry176comment</comments>
      <pubDate>Sat, 17 Dec 2022 07:15:53 +0900</pubDate>
    </item>
    <item>
      <title>[Node] cluster</title>
      <link>https://yexjinitlog.tistory.com/175</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;cluster 모듈&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;싱글 프로세스로 동작하는 노드가 CPU 코어를 모두 사용&lt;/b&gt;&lt;/span&gt;할 수 있게 해주는 모듈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;cluster 모듈의 &lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 포트를 공유하는 노드 프로세스를 여러개 둘 수 있음 &amp;rarr; &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;요청이 들어왔을 때 병렬로 실행된 서버의 개수만큼 요청이 분산&lt;/b&gt;&lt;/span&gt;되게 할 수 있음&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;rarr; 서버에 무리가 덜 가게 되게 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;cluser 모듈의 &lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; 프로세스들 간에 메모리를 공유하지 못하는 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 세션을 메모리에 저장하는 경우 문제가 될 수 있음 &amp;rarr; &lt;b&gt;레디스 등의 서버를 도입&lt;/b&gt;하여 해결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;cluster의 종류&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;마스터 프로세스&lt;/b&gt;&lt;/span&gt; : &lt;b&gt;CPU 개수만큼 워커 프로세스를 만듦&lt;/b&gt;. 8086 포트에서 대기, 요청이 들어오면 만들어진 워커 프로세스에 요청을 분배&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;워커 프로세스&lt;/b&gt;&lt;/span&gt; : &lt;b&gt;실제로 일&lt;/b&gt;을 하는 프로세스&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`마스터 프로세스 아이디: ${process.pid}`);
  // CPU 개수만큼 워커를 생산
  for (let i = 0; i &amp;lt; numCPUs; i += 1) {
    cluster.fork();
  }
  // 워커가 종료되었을 때
  cluster.on('exit', (worker, code, signal) =&amp;gt; {
    console.log(`${worker.process.pid}번 워커가 종료되었습니다.`);
    console.log('code', code, 'signal', signal);
  });
} else {
  // 워커들이 포트에서 대기
  http.createServer((req, res) =&amp;gt; {
    res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
    res.write('&amp;lt;h1&amp;gt;Hello Node!&amp;lt;/h1&amp;gt;');
    res.end('&amp;lt;p&amp;gt;Hello Cluster!&amp;lt;/p&amp;gt;');
  }).listen(8086);

  console.log(`${process.pid}번 워커 실행`);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Reference&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- Node.js 교과서 개정 2판&lt;/span&gt;&lt;/p&gt;</description>
      <category>Node.js</category>
      <category>cluster</category>
      <category>node</category>
      <category>node.js</category>
      <author>yevdev</author>
      <guid isPermaLink="true">https://yexjinitlog.tistory.com/175</guid>
      <comments>https://yexjinitlog.tistory.com/175#entry175comment</comments>
      <pubDate>Sun, 11 Dec 2022 17:21:33 +0900</pubDate>
    </item>
    <item>
      <title>[Node] https와 http2</title>
      <link>https://yexjinitlog.tistory.com/174</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ https 모듈&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 웹 서버에 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;SSL 암호화&lt;/b&gt;&lt;/span&gt;를 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- GET 이나 POST 요청을 할 때 오가는 데이터를 암호화해서 중간에 다른 사람이 요청을 가로채더라도 내용을 확인할 수 없게 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;로그인&lt;/b&gt;이나 &lt;b&gt;결제&lt;/b&gt;가 필요한 창에서 https 적용이 필수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;인증서&lt;/b&gt;를 인증기관에서 구입 혹은 Let's Encrypt 같은 기관에서 무료로 발급 받아야함&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const https = require('https');
const fs = require('fs');

https.createServer({
  cert: fs.readFileSync('도메인 인증서 경로'),
  key: fs.readFileSync('도메인 비밀키 경로'),
  ca: [
    fs.readFileSync('상위 인증서 경로'),
    fs.readFileSync('상위 인증서 경로'),
  ],
}, (req, res) =&amp;gt; {
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
  res.write('&amp;lt;h1&amp;gt;Hello Node!&amp;lt;/h1&amp;gt;');
  res.end('&amp;lt;p&amp;gt;Hello Server!&amp;lt;/p&amp;gt;');
})
  .listen(443, () =&amp;gt; {
    console.log('443번 포트에서 서버 대기 중입니다!');
  });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실제 서버에서는 80포트 대신 &lt;b&gt;443 포트&lt;/b&gt;를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ http2 모듈&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;SSL 암호화&lt;/b&gt;&lt;/span&gt;와 더불어 최신 HTTP 프로토콜인 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;http/2&lt;/b&gt;&lt;/span&gt;를 사용할 수 있게 함.&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;const http2 = require('http2');
const fs = require('fs');

http2.createSecureServer({
  cert: fs.readFileSync('도메인 인증서 경로'),
  key: fs.readFileSync('도메인 비밀키 경로'),
  ca: [
    fs.readFileSync('상위 인증서 경로'),
    fs.readFileSync('상위 인증서 경로'),
  ],
}, (req, res) =&amp;gt; {
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
  res.write('&amp;lt;h1&amp;gt;Hello Node!&amp;lt;/h1&amp;gt;');
  res.end('&amp;lt;p&amp;gt;Hello Server!&amp;lt;/p&amp;gt;');
})
  .listen(443, () =&amp;gt; {
    console.log('443번 포트에서 서버 대기 중입니다!');
  });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- createServer 메서드를 &lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;createSecure Server&lt;/b&gt;&lt;/span&gt; 메서드로 바꾸면 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Reference&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- Node.js 교과서 개정 2판&lt;/span&gt;&lt;/p&gt;</description>
      <category>Node.js</category>
      <category>http2</category>
      <category>https</category>
      <category>node</category>
      <category>node.js</category>
      <author>yevdev</author>
      <guid isPermaLink="true">https://yexjinitlog.tistory.com/174</guid>
      <comments>https://yexjinitlog.tistory.com/174#entry174comment</comments>
      <pubDate>Sun, 11 Dec 2022 17:19:32 +0900</pubDate>
    </item>
    <item>
      <title>[Node] 쿠키와 세션</title>
      <link>https://yexjinitlog.tistory.com/173</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;쿠키&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;유효기간이 있음&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 키-값의 쌍 형태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버는 미리 클라이언트에 요청자를 추정할 만한 정보를 쿠키로 만들어 보내고, 그 다음부터는 클라이언트로부터 쿠키를 받아 요청자를 파악&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;서버에서 쿠키 만들기&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const http = require('http');

http.createServer((req, res) =&amp;gt; {
  console.log(req.url, req.headers.cookie);
  res.writeHead(200, { 'Set-Cookie': 'mycookie=test' });
  res.end('Hello Cookie');
})
  .listen(8083, () =&amp;gt; {
    console.log('8083번 포트에서 서버 대기 중입니다!');
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 쿠키는 문자열 형식(mycookie=test)으로 존재, 쿠키 간에는 세미콜론으로 구분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;req.headers.cookie&lt;/b&gt;&lt;/span&gt; : 쿠키가 들어있는 곳&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;req.headers&lt;/b&gt;&lt;/span&gt; : 요청의 헤더 (쿠키는 요청과 응답의 헤더를 오간다는 것을 알 수 있음!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Set-Cookie&lt;/span&gt;&lt;/b&gt; : 응답의 헤더에 mycookie-test라는 쿠키를 심으라고 브라우저에게 명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;쿠키 설정 옵션들&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;쿠키명=쿠키값&lt;/span&gt;: 기본적인 쿠키의 값입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;mycookie=test&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;name=zerocho&lt;/span&gt;와 같이 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span&gt;xpires&lt;/span&gt;&lt;span&gt;=날짜&lt;/span&gt;: 만료 기한입니다. 이 기한이 지나면 쿠키가 제거됩니다. 기본값은 클라이언트가 종료될 때까지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Max-age=초&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Expires&lt;/span&gt;와 비슷하지만 날짜 대신 초를 입력할 수 있습니다. 해당 초가 지나면 쿠기가 제거됩니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span&gt;xpires&lt;/span&gt;보다 우선합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;omain&lt;/span&gt;&lt;span&gt;=도메인명&lt;/span&gt;: 쿠키가 전송될 도메인을 특정할 수 있습니다. 기본값은 현재 도메인입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;ath&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;: 쿠키가 전송될 URL을 특정할 수 있습니다. 기본값은 &amp;lsquo;/&amp;rsquo;이고, 이 경우 모든 URL에서 쿠키를 전송할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;ecure&lt;/span&gt;: HTTPS일 경우에만 쿠키가 전송됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;H&lt;/span&gt;&lt;span&gt;ttp&lt;/span&gt;&lt;span&gt;O&lt;/span&gt;&lt;span&gt;nly&lt;/span&gt;: 설정 시 자바스크립트에서 쿠키에 접근할 수 없습니다. 쿠키 조작을 방지하기 위해 설정하는 것이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/yexjin/node-study/blob/main/cookie_session/cookie2.js&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;쿠키로 로그인 서버 구현하기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670746562757&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - yexjin/node-study: 이번엔 기필코 끝내고만다..✨&quot; data-og-description=&quot;이번엔 기필코 끝내고만다..✨. Contribute to yexjin/node-study development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/yexjin/node-study/blob/main/cookie_session/cookie2.js&quot; data-og-url=&quot;https://github.com/yexjin/node-study&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/byqWDm/hyQQAb1LLJ/fvOz4wKdqKILT1T5KVdDXK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/yexjin/node-study/blob/main/cookie_session/cookie2.js&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/yexjin/node-study/blob/main/cookie_session/cookie2.js&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/byqWDm/hyQQAb1LLJ/fvOz4wKdqKILT1T5KVdDXK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - yexjin/node-study: 이번엔 기필코 끝내고만다..✨&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이번엔 기필코 끝내고만다..✨. Contribute to yexjin/node-study development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;❗️쿠키의 조작 위험성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개발자 도구에서 Application 탭에서 보이는 것처럼 쿠키가 노출되어 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;민감한 개인정보를 쿠키에 넣어두는 것은 적절하지 못함&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;세션 쿠키&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;세션을 위해 사용하는 쿠키&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 쿠키를 사용해 세션 아이디를 주고받는 식&lt;/p&gt;
&lt;pre id=&quot;code_1670744592375&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   //  쿠키에 이름을 담아서 보내는 대신 uniqueInt 라는 속성 명 아래에 있는 session 변수에서 사용자 정보를 가져와 사용
    // - 서버에 사용자 정보를 저장하고 클라이언트와는 세션 아이디로만 소통
    res.writeHead(302, {
      Location: '/',
      'Set-Cookie': `session=${uniqueInt}; Expires=${expires.toGMTString()}; HttpOnly; Path=/`,
    });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt; 실제 배포용 서버에서는 세션을 위와 같이 변수에 저장하지는 않음&lt;/b&gt;&lt;/span&gt; : 서버가 멈추거나 재시작되면 메모리에 저장된 변수가 초기화되기 때문 + 또한 서버의 메모리가 부족하면 세션을 저장하지 못하는 문제도 생김&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 따라서 보통 &lt;b&gt;레디스&lt;/b&gt;나 &lt;b&gt;멤캐시드&lt;/b&gt; 같은 데이터베이스에 넣어둠&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Reference&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- Node.js 교과서 개정 2판&lt;/span&gt;&lt;/p&gt;</description>
      <category>Node.js</category>
      <category>node</category>
      <category>node.js</category>
      <category>세션</category>
      <category>쿠키</category>
      <author>yevdev</author>
      <guid isPermaLink="true">https://yexjinitlog.tistory.com/173</guid>
      <comments>https://yexjinitlog.tistory.com/173#entry173comment</comments>
      <pubDate>Sun, 11 Dec 2022 17:17:52 +0900</pubDate>
    </item>
    <item>
      <title>[Node] REST, HTTP 메서드 개념</title>
      <link>https://yexjinitlog.tistory.com/172</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;REST?&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- REpresentational State Transfer&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;서버의 자원을 정의하고 자원에 대한 주소를 지정&lt;/b&gt;하는 방법 ( = 약속 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt; HTTP URI를 통해 자원을 표시하고, HTTP 메서드를 통해 해당 자원에 대한 CRUD 연산을 적용&lt;/b&gt;&lt;/span&gt;한 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 꼭 파일일 필요는 없고 서버가 행할 수 있는 것들을 통틀어서 의미함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HTTP 요청 메서드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클라이언트가 웹 서버에게 사용자 요청의 목적이나 종류를 알리는 수단&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GET : 존재하는 자원에 대한 요청 데이터 조회, CRUD로 따지면 Read&lt;/li&gt;
&lt;li&gt;POST : 새로운 자원을 생성 데이터 등록, CRUD로 따지면 Create&lt;/li&gt;
&lt;li&gt;PUT : 존재하는 자원에 대한 변경 (자원 전체를 갱신) 데이터 수정, CRUD로 따지면 Update&lt;/li&gt;
&lt;li&gt;PATCH : 존재하는 자원에 대한 변경 (자원 일부를 교체) 일부 데이터 수정&lt;/li&gt;
&lt;li&gt;DELETE : 존재하는 자원에 대한 삭제 데이터 삭제, CRUD로 따지면 Delete&lt;/li&gt;
&lt;li&gt;OPTIONS를 사용하면 서버가 허용하는 메서드를 확인할 수 있는데, 이때 PUT, DELETE와 같은 메서드로 공격을 당할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RESTful하다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- REST를 따르는 서버&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;lsquo;REST API&amp;rsquo;를 제공하는 서비스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;REST API&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Rest를 기반으로 서비스 API&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Reference&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- Node.js 교과서 개정 2판&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;reaction-171&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Node.js</category>
      <category>HTTP</category>
      <category>node</category>
      <category>node.js</category>
      <category>Rest</category>
      <category>restAPI</category>
      <author>yevdev</author>
      <guid isPermaLink="true">https://yexjinitlog.tistory.com/172</guid>
      <comments>https://yexjinitlog.tistory.com/172#entry172comment</comments>
      <pubDate>Sun, 11 Dec 2022 17:14:30 +0900</pubDate>
    </item>
    <item>
      <title>[Node] 이벤트, 이벤트 메서드</title>
      <link>https://yexjinitlog.tistory.com/171</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;스트림을 공부했을 때, on('data', 콜백) 또는 on('end', 콜백)을 사용했음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 data라는 이벤트와 end라는 이벤트가 발생할 때 콜백함수를 호출하도록 이벤트를 등록한 것!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 노드에서 이벤트를 만들고 호출하고 삭제해보자&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;const EventEmitter = require('events');

const myEvent = new EventEmitter();
myEvent.addListener('event1', () =&amp;gt; {
  console.log('이벤트 1');
});
myEvent.on('event2', () =&amp;gt; {
  console.log('이벤트 2');
});
myEvent.on('event2', () =&amp;gt; {
  console.log('이벤트 2 추가');
});
myEvent.once('event3', () =&amp;gt; {
  console.log('이벤트 3');
}); // 한 번만 실행됨

myEvent.emit('event1'); // 이벤트 호출
myEvent.emit('event2'); // 이벤트 호출

myEvent.emit('event3'); // 이벤트 호출
myEvent.emit('event3'); // 실행 안 됨

myEvent.on('event4', () =&amp;gt; {
  console.log('이벤트 4');
});
myEvent.removeAllListeners('event4');
myEvent.emit('event4'); // 실행 안 됨

const listener = () =&amp;gt; {
  console.log('이벤트 5');
};
myEvent.on('event5', listener);
myEvent.removeListener('event5', listener);
myEvent.emit('event5'); // 실행 안 됨

console.log(myEvent.listenerCount('event2'));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ node event
이벤트 1
이벤트 2
이벤트 2 추가
이벤트 3
2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 관리를 위한 여러 메서드들&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;on(이벤트명, 콜백)&lt;/span&gt;: 이벤트 이름과 이벤트 발생 시의 콜백을 연결합니다. 이렇게 연결하는 동작을 이벤트 리스닝이라고 부릅니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;처럼 이벤트 하나에 이벤트 여러 개를 달아줄 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt;L&lt;/span&gt;&lt;span&gt;istener(이벤트명, 콜백)&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;on&lt;/span&gt;과 기능이 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;emit(이벤트명)&lt;/span&gt;: 이벤트를 호출하는 메서드입니다. 이벤트 이름을 인수로 넣으면 미리 등록해뒀던 이벤트 콜백이 실행됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;once(이벤트명, 콜백)&lt;/span&gt;: 한 번만 실행되는 이벤트입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;my&lt;/span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span&gt;vent.emit&lt;/span&gt;&lt;span&gt;('&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;')&lt;/span&gt;을 두 번 연속 호출했지만 콜백이 한 번만 실행됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;remove&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;ll&lt;/span&gt;&lt;span&gt;L&lt;/span&gt;&lt;span&gt;isteners(이벤트명)&lt;/span&gt;: 이벤트에 연결된 모든 이벤트 리스너를 제거합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;가 호출되기 전에 리스너를 제거했으므로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;의 콜백은 호출되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;remove&lt;/span&gt;&lt;span&gt;L&lt;/span&gt;&lt;span&gt;istener(이벤트명, 리스너)&lt;/span&gt;: 이벤트에 연결된 리스너를 하나씩 제거합니다. 리스너를 넣어야 한다는 것을 잊지 마세요. 역시&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;의 콜백도 호출되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;off(이벤트명, 콜백)&lt;/span&gt;: 노드 10 버전에서 추가된 메서드로,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;remove&lt;/span&gt;&lt;span&gt;L&lt;/span&gt;&lt;span&gt;istener&lt;/span&gt;와 기능이 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;listener&lt;/span&gt;&lt;span&gt;C&lt;/span&gt;&lt;span&gt;ount(이벤트명)&lt;/span&gt;: 현재 리스너가 몇 개 연결되어 있는지 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Reference&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- Node.js 교과서 개정 2판&lt;/span&gt;&lt;/p&gt;</description>
      <category>Node.js</category>
      <category>EVENT</category>
      <category>node</category>
      <category>node.js</category>
      <category>이벤트</category>
      <author>yevdev</author>
      <guid isPermaLink="true">https://yexjinitlog.tistory.com/171</guid>
      <comments>https://yexjinitlog.tistory.com/171#entry171comment</comments>
      <pubDate>Sat, 10 Dec 2022 16:40:56 +0900</pubDate>
    </item>
    <item>
      <title>[Node] 파일시스템, 버퍼, 스트림 알아보기</title>
      <link>https://yexjinitlog.tistory.com/170</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;fs&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파일 시스템에 접근하는 모듈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  fs.readFile&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파일 읽기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 결과물 : 버퍼(buffer) 형태로 출력되어서 사람이 읽을 수 있는 형색으로 변환 ( toString 사용 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  fs.writeFile&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파일 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  프로미스 기반의 fs 모듈&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- fs는 기본적으로 콜백 형식의 모듈이므로 실무에서 사용하기가 불편&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;const fs = require('fs').promises;

fs.readFile('./readme.txt')
  .then((data) =&amp;gt; {
    console.log(data);
    console.log(data.toString());
  })
  .catch((err) =&amp;gt; {
    console.error(err);
  });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;readFile과 readFileSync 메서드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  readFile&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #f6e199;&quot;&gt;비동기&lt;/span&gt; 메서드 : 백그라운드에서 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실행순서가 순차적이지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  readFileSync&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #f6e199;&quot;&gt;동기&lt;/span&gt; 메서드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실행순서가 순차적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 콜백 함수를 넣는 대신 직접 return 값을 받아와야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기 방식으로 하되 순서를 유지하고 싶다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 readFile의 콜백 다음에 다음 readFile을 넣으면 됨 &amp;rarr; &lt;b&gt;BUT 콜백지옥!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✨ 콜백지옥은 Promise나 async/await로 어느정도 해결 가능&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;const fs = require('fs').promises;

console.log('시작');
fs.readFile('./readme2.txt')
  .then((data) =&amp;gt; {
    console.log('1번', data.toString());
    return fs.readFile('./readme2.txt');
  })
  .then((data) =&amp;gt; {
    console.log('2번', data.toString());
    return fs.readFile('./readme2.txt');
  })
  .then((data) =&amp;gt; {
    console.log('3번', data.toString());
    console.log('끝');
  })
  .catch((err) =&amp;gt; {
    console.error(err);
  });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 잠깐 언급한 버퍼에 대해 알아보자 (스트림도!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;버퍼&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메모리에 저장된 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 노드는 파일을 읽을 때 메모리에 파일 크기만큼 공간을 마련해두며 파일 데이터를 메모리에 저장한 뒤 사용자가 조작할 수 있도록 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Buffer&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 버퍼를 직접 다룰 수 있는 클래스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Buffer가 제공하는 여러가지 메서드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;from(문자열)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 문자열을 버퍼로 바꿀 수 있습니다.&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;속성은 버퍼의 크기를 알립니다. 바이트 단위입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;to&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;S&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;tring(버퍼)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 버퍼를 다시 문자열로 바꿀 수 있습니다. 이때 base64나 hex를 인수로 넣으면 해당 인코딩으로도 변환 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;concat(배열)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 배열 안에 든 버퍼들을 하나로 합칩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;alloc(바이트)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 빈 버퍼를 생성합니다. 바이트를 인수로 넣으면 해당 크기의 버퍼가 생성됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버퍼의 단점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모든 내용을 버퍼에 다 쓴 후에야 다음 동작으로 넘어가므로 파일 읽기, 압축, 파일 쓰기 등의 조작을 연달아 할 때 매번 전체 용량을 버퍼로 처리해야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스트림&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 버퍼의 단점 해결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 버퍼의 크기를 작게 만든 후 여러 번으로 나눠 보내는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;createReadStream&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파일을 읽는 스트림 메서드&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;const fs = require('fs');

const readStream = fs.createReadStream('./readme3.txt', { highWaterMark: 16 });
const data = [];

readStream.on('data', (chunk) =&amp;gt; {
  data.push(chunk);
  console.log('data :', chunk, chunk.length);
});

readStream.on('end', () =&amp;gt; {
  console.log('end :', Buffer.concat(data).toString());
});

readStream.on('error', (err) =&amp;gt; {
  console.log('error :', err);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;highWaterMark : 버퍼의 크기를 정할 수 있는 옵션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;createWriteStream&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파일을 만드는 스트림 메서드&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;const fs = require('fs');

const writeStream = fs.createWriteStream('./writeme2.txt');
writeStream.on('finish', () =&amp;gt; {
  console.log('파일 쓰기 완료');
});

writeStream.write('이 글을 씁니다.\n');
writeStream.write('한 번 더 씁니다.');
writeStream.end();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;createReadStream으로 파일을 읽고 그 스트림을 전달받아 createWriteStream으로 파일 만들기 ( = 파일 복사와 비슷 )&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;파이핑하다&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;span style=&quot;color: #0593d3;&quot;&gt; 스트림끼리 연결하는 것&lt;/span&gt;을 의미&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const fs = require('fs');

const readStream = fs.createReadStream('readme4.txt');
const writeStream = fs.createWriteStream('writeme3.txt');
readStream.pipe(writeStream);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미리 읽기 스트림과 쓰기 스트림 사이를 &lt;b&gt;pipe 메서드&lt;/b&gt;로 연결하면 저절로 데이터가 writeStream으로 넘어감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Reference&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- Node.js 교과서 개정 2판&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;reaction-168&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Node.js</category>
      <category>fs</category>
      <category>node</category>
      <category>노드</category>
      <category>파일시스템</category>
      <author>yevdev</author>
      <guid isPermaLink="true">https://yexjinitlog.tistory.com/170</guid>
      <comments>https://yexjinitlog.tistory.com/170#entry170comment</comments>
      <pubDate>Sat, 10 Dec 2022 16:40:35 +0900</pubDate>
    </item>
    <item>
      <title>[Node] 노드의 내장 모듈들</title>
      <link>https://yexjinitlog.tistory.com/169</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;주요한 노드 내장 모듈들에 대해 빠르게 알아보자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1️⃣ os&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자 컴퓨터의 운영체제 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 일반적인 웹 서비스를 제작할 때는 사용 빈도가 높지 않지만 운영체제 별로 다른 서비스를 제공하고 싶을 때 유용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&amp;nbsp;os.arch()&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;process.arch&lt;/span&gt;와 동일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;os.platform()&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;process.platform&lt;/span&gt;과 동일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;os.type()&lt;/span&gt;: 운영체제의 종류를 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;os.uptime()&lt;/span&gt;: 운영체제 부팅 이후 흐른 시간(초)을 보여줌.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;process.uptime&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;은 노드의 실행 시간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;os.hostname()&lt;/span&gt;: 컴퓨터의 이름을 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;os.release()&lt;/span&gt;: 운영체제의 버전을 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;os.homedir()&lt;/span&gt;: 홈 디렉터리 경로를 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;os.tmpdir()&lt;/span&gt;: 임시 파일 저장 경로를 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;os.cpus()&lt;/span&gt;: 컴퓨터의 코어 정보를 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;os.freemem()&lt;/span&gt;: 사용 가능한 메모리&lt;span style=&quot;color: #6e6e6e;&quot;&gt;(RAM)&lt;/span&gt;를 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;os.totalmem()&lt;/span&gt;: 전체 메모리 용량을 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2️⃣ path&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 폴더와 파일의 경로를 쉽게 조작하도록 도와주는 모듈&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 앞으로 노드 프로그래밍을 하면서 매우 자주 쓰게 될 모듈 중 하나&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;path.sep&lt;/span&gt;: 경로의 구분자. 윈도는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;, POSIX는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;path.delimiter&lt;/span&gt;: 환경 변수의 구분자.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;process.env.PATH&lt;/span&gt;를 입력하면 여러 개의 경로가 이 구분자로 구분됨. 윈도는 세미콜론(&lt;span&gt;;)&lt;/span&gt;이고, POSIX는 콜론(&lt;span&gt;:)&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;path.dirname(경로)&lt;/span&gt;: 파일이 위치한 폴더 경로를 보여줌.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;path.extname(경로)&lt;/span&gt;: 파일의 확장자를 보여줌.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;path.basename(경로, 확장자)&lt;/span&gt;: 파일의 이름(확장자 포함)을 표시. 파일의 이름만 표시하고 싶다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;basename&lt;/span&gt;의 두 번째 인수로 파일의 확장자를 넣으면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;path.parse(경로)&lt;/span&gt;: 파일 경로를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;root&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;base&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;ext&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;으로 분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;path.format(객체)&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;path.parse&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;한 객체를 파일 경로로 합침&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;path.normalize(경로)&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;를 실수로 여러 번 사용했거나 혼용했을 때 정상적인 경로로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;path.is&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;bsolute(경로)&lt;/span&gt;: 파일의 경로가 절대경로인지 상대경로인지를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;로 알림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;path.relative(기준경로, 비교경로)&lt;/span&gt;: 경로를 두 개 넣으면 첫 번째 경로에서 두 번째 경로로 가는 방법을 알림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;path.join(경로, &amp;hellip;)&lt;/span&gt;: 여러 인수를 넣으면 하나의 경로로 합침. 상대경로인 ..(부모 디렉터리)과 .(현 위치)도 알아서 처리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;path.resolve(경로, &amp;hellip;)&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;path.join&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;과 비슷하지만 차이가 있음.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3️⃣ url&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인터넷 주소를 쉽게 조작하도록 도와주는 모듈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url 처리의 두가지 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;b&gt;WHATWG&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const url = require('url');

// url 모듈 안에 URL 생성자가 있음
// 이 URL 생성자에 주소를 넣어 객체로 만들면 주소가 부분별로 정리됨
// WHATWG에만 있는 username, password, origin, searchParams 속성이 존재


const { URL } = url;

const myURL = new URL('http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor');

console.log('new URL():', myURL);
console.log('url.format():', url.format(myURL));
console.log('------------------------------');
const parsedUrl = url.parse('http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor');
console.log('url.parse():', parsedUrl);
console.log('url.format():', url.format(parsedUrl));&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;b&gt;기존 노드 방식&lt;/b&gt; : 아래 두개의 메서드를 주로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) url.parse(주소)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 주소를 분해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - WHATWG의 username과 password 대신 auth 속성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - WHATWG의 searchParams 대신 query 속성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) url.format(객체)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - WHATWG 방식 url과 기존 노드의 url을 모두 사용할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 분해되었던 url 객체를 다시 원래 상태로 조립&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;searchParams&lt;/b&gt; 객체의 여러 메서드들&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;A&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;ll(키)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 키에 해당하는 모든 값들을 가져옴.&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;category&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;키에는&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;nodejs&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;와&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;javascript&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;라는 두 가지 값이 들어 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;get(키)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 키에 해당하는 첫 번째 값만 가져옴.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;has(키)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 해당 키가 있는지 없는지를 검사&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;keys()&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;search&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;P&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;arams&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;의 모든 키를 반복기&lt;/span&gt;&lt;span style=&quot;color: #6e6e6e;&quot;&gt;(iterator)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;(ES2015 문법) 객체로 가져옴&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;values()&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;search&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;P&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;arams&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;의 모든 값을 반복기 객체로 가져옴&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;append(키, 값)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 해당 키를 추가합니다. 같은 키의 값이 있다면 유지하고 하나 더 추가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;set(키, 값)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;와 비슷하지만, 같은 키의 값들을 모두 지우고 새로 추가.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;delete(키)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 해당 키를 제거&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;toString()&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 조작한&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;search&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;P&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;arams&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;객체를 다시 문자열로 만듦. 이 문자열을&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;search&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;에 대입하면 주소 객체에 반영&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  query 같은 문자열보다 &lt;b&gt;searchParams가 유용한 이유&lt;/b&gt;는 query의 경우 다음에 배우는 querystring 모듈을 한 번 더 사용해야 하기 때문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  querystring&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- WHATWG방식의 url 대신 기존 노드의 url을 사용할 때, search 부분을 사용하기 쉽게 객체로 만드는 모듈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;querystring.parse(쿼리)&lt;/span&gt;: url의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;부분을 자바스크립트 객체로 분해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;querystring.stringify(객체)&lt;/span&gt;: 분해된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;객체를 문자열로 다시 조립&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4️⃣ crypto&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다양한 방식의 암호화를 도와주는 모듈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  단방향 암호화 알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비밀번호와 같이 복호화가 필요없는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 해시 기법을 주로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 해시 기법? 어떠한 문자열을 고정된 길이의 다른 문자열로 바꿔버리는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;createHash(알고리즘)&lt;/span&gt;: 사용할 해시 알고리즘을 넣음. md5, sha1, sha256, sha512 등이 가능하지만, md5와 sha1은 이미 취약점이 발견. 현재는 sha512 정도로 충분하지만, 나중에 sha512마저도 취약해지면 더 강화된 알고리즘으로 바꿔야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;update(문자열)&lt;/span&gt;: 변환할 문자열을 넣음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;digest(인코딩)&lt;/span&gt;: 인코딩할 알고리즘을 넣음. base64, hex, latin1이 주로 사용되는데, 그중 base64가 결과 문자열이 가장 짧아 애용. 결과물로 변환된 문자열을 반환.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  양방향 암호화 알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 키를 통해 암호화된 문자열을 복호화 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;crypto.create&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;C&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;ipheriv(알고리즘, 키,&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;iv&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 암호화 알고리즘과 키,&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;iv&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;를 넣습니다. 암호화 알고리즘은 aes-256-cbc를 사용했으며, 다른 알고리즘을 사용해도 됩니다. aes-256-cbc 알고리즘의 경우 키는 32바이트여야 하고,&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;iv&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;는 16바이트여야 합니다.&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;iv&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;는 암호화할 때 사용하는 초기화 벡터를 의미하지만, 이 책에서 설명하기에는 내용이 많으므로 AES 암호화에 대해 따로 공부하는 것이 좋습니다. 사용 가능한 알고리즘 목록은&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;crypto.get&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;C&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;iphers&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;를 호출하면 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;cipher.update(문자열, 인코딩, 출력 인코딩)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 암호화할 대상과 대상의 인코딩, 출력 결과물의 인코딩을 넣습니다. 보통 문자열은 utf8 인코딩을, 암호는 base64를 많이 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;cipher.final(출력 인코딩)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 출력 결과물의 인코딩을 넣으면 암호화가 완료됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;crypto.create&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;D&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;ecipheriv(알고리즘, 키,&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;iv&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 복호화할 때 사용합니다. 암호화할 때 사용했던 알고리즘과 키,&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;iv&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;를 그대로 넣어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;decipher.update(문자열, 인코딩, 출력 인코딩)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 암호화된 문장, 그 문장의 인코딩, 복호화할 인코딩을 넣습니다.&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;C&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;ipheriv&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;의&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;update&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;에서 utf8, base64순으로 넣었다면&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;D&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;ecipheriv&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;의&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;update&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;에서는 base64, utf8순으로 넣으면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;decipher.final(출력 인코딩)&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 복호화 결과물의 인코딩을 넣습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;5️⃣ util&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;- 각종 편의 기능을 모아둔 모듈&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;util.deprecate&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 함수가 deprecated 처리되었음을 알립니다. 첫 번째 인수로 넣은 함수를 사용했을 때 경고 메시지가 출력됩니다. 두 번째 인수로 경고 메시지 내용을 넣으면 됩니다. 함수가 조만간 사라지거나 변경될 때 알려줄 수 있어 유용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #696969;&quot;&gt;&amp;bull;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;util.promisify&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: 콜백 패턴을 프로미스 패턴으로 바꿉니다. 바꿀 함수를 인수로 제공하면 됩니다. 이렇게 바꿔두면&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;패턴까지 사용할 수 있어 좋습니다. 3.5.5.1절의&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;random&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;B&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;ytes&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;와 비교해보세요. 프로미스를 콜백으로 바꾸는&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;util.callbackify&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;도 있지만 자주 사용되지는 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6️⃣ worker_threads&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 노드에서 &lt;b&gt;멀티 스레드 방식&lt;/b&gt;으로 작업하는 것이 가능하게 하는 모듈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;worker_threads.js&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const { 
  Worker, isMainThread, parentPort,
} = require('worker_threads'); 

if (isMainThread) { // 부모일 때 
  const 
  worker = new Worker(__filename); 
  worker.on('message', message =&amp;gt; console.log('from worker', message)); 
  worker.on('exit', () =&amp;gt; console.log('worker exit')); 
  worker.postMessage('ping');
} else { // 워커일 때 
  parentPort.on('message', (value) =&amp;gt; { 
    console.log('from parent', value); 
    parentPort.postMessage('pong'); 
    parentPort.close(); 
  }); 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;worker.postMessage : 워커에 데이터를 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;parentPort.on('message') 이벤트리스너 : 부모로부터 메시지를 받음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;parentPost.postMessage('pong'): 부모에게 메시지를 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;worker.on('message') : 부모가 메시지를 받는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;parentPort.close() : 부모와의 연결 종료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 종료될때는 worker.on('exit')이 실행&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ node worker_threads
from parent ping
from worker pong
worker exit&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  여러개의 worker thread에 데이터를 보내보기&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;// worker_data.js

const {
  Worker, isMainThread, parentPort, workerData,
} = require('worker_threads');

if (isMainThread) { // 부모일 때
  const threads = new Set();
  threads.add(new Worker(__filename, {
    workerData: { start: 1 },
  }));
  threads.add(new Worker(__filename, {
    workerData: { start: 2 },
  }));
  for (let worker of threads) {
    worker.on('message', message =&amp;gt; console.log('from worker', message));
    worker.on('exit', () =&amp;gt; {
      threads.delete(worker);
      if (threads.size === 0) {
        console.log('job done');
      }
    });
  }
} else { // 워커일 때
  const data = workerData;
  parentPort.postMessage(data.start + 100);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;new Worker을 호출할 때, 두번째 인수의 workerData 속성으로 원하는 데이터를 보낼 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 워커에서는 workerData로 부모로부터 데이터를 받음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서는 두개의 워커가 돌아가고 있으며, 각각 부모로부터 숫자를 받아서 100을 더해 돌려줌 &amp;rarr; 돌려주는 순간 워커가 종료되어 worker.on('exit') 수행 &lt;span&gt;&amp;rarr;&lt;span&gt; 두개의 워커 모두 종료되면 job done이 로깅&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ node worker_data
from worker 101
from worker 102
job done&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7️⃣ child_process&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 노드에서 &lt;b&gt;다른 프로그램을 실행하고 싶거나 명령어를 수행&lt;/b&gt;하고 싶을 때 사용하는 모듈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 노드 프로세스 외에 새로운 프로세스를 띄워서 명령을 수행하고, 노드 프로세스에 결과를 알려줌 (그래서 이름이 자식 프로세스 인 것!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  exec&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 명령 프롬프트의 명령어 ls를 노드를 통해 실행해보자! (윈도우의 경우 dir)&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const exec = require('child_process').exec;

var process = exec('dir');

process.stdout.on('data', function(data) {
  console.log(data.toString());
}); // 실행 결과

process.stderr.on('data', function(data) {
  console.error(data.toString());
}); // 실행 에러&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- stdout(표준출력)과 stderr(표준에러)에 붙여둔 data 이벤트 리스너에 버퍼 형태로 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 폴더의 파일 목록이 표시됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  spawn&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파이썬 코드를 실행해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- spawn의 첫번째 인수 : 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- spawn의 두번째 인수 : 옵션 배열&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const spawn = require('child_process').spawn;

var process = spawn('python', ['test.py']);

process.stdout.on('data', function(data) {
  console.log(data.toString());
}); // 실행 결과

process.stderr.on('data', function(data) {
  console.error(data.toString());
}); // 실행 &amp;gt;에러&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;exec 와 spawn의 차이점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- exec : 셸을 실행해서 명령어를 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- spawn : 새로운 프로세스를 띄우면서 명령어를 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Reference&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- Node.js 교과서 개정 2판&lt;/span&gt;&lt;/p&gt;</description>
      <category>Node.js</category>
      <category>node</category>
      <category>node.js</category>
      <category>노드</category>
      <category>노드내장모듈</category>
      <author>yevdev</author>
      <guid isPermaLink="true">https://yexjinitlog.tistory.com/169</guid>
      <comments>https://yexjinitlog.tistory.com/169#entry169comment</comments>
      <pubDate>Sat, 10 Dec 2022 16:38:08 +0900</pubDate>
    </item>
    <item>
      <title>[Node] 노드의 내장 객체들</title>
      <link>https://yexjinitlog.tistory.com/168</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;말 그대로 빠르게 노드 프로그래밍을 할 때 자주 사용되는 노드의 내장 객체들에 대해 하나씩 살펴보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;global&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전역 객체 : 모든 파일에서 접근 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 생략 가능 : console 객체도 원래는 global.console 이었음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 남용 주의 : 프로그램의 규모가 커질수록 어떤 파일에서 global 객체에 값을 대입했는지 찾기 힘들어져 유지 보수에 어려움을 겪을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;console&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 디버깅과 에러 내용 및 코드 실행 시간 확인에 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;console.log&lt;/span&gt; 메서드가 대표적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt; console.time(레이블)&lt;/span&gt; : time과 timeEnd 사이의 시간을 측정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;console.error(에러 내용)&lt;/span&gt; : 에러를 콘솔에 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;console.table(배열)&lt;/span&gt; : 테이블 형식으로 표현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;console.dir(객체, 옵션)&lt;/span&gt; : 객체를 콘솔에 표시할 때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;console.trace(레이블)&lt;/span&gt; : 에러 발생 위치 추적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타이머&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;setTimeout(콜백 함수, 밀리초)&lt;/span&gt; : 주어진 밀리초 이후에 콜백함수 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;setInterval(콜백 함수, 밀리초)&lt;/span&gt; : 주어진 밀리초마다 콜백함수를 반복 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;setImmediate(콜백 함수)&lt;/span&gt; : 콜백함수를 즉시 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;clearTimeout(아이디)&lt;/span&gt; : setTimeout을 취소 : 아이디 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;clearInterval(아이디)&lt;/span&gt; : setInterval을 취소 : 아이디 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;clearImmediate(아이디)&lt;/span&gt; : setImmediate를 취소 : 아이디 반환&lt;/p&gt;
&lt;pre id=&quot;code_1670430904427&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const timeout = setTimeout(() =&amp;gt; {
  console.log('1.5초 후 실행');
}, 1500);

const interval = setInterval(() =&amp;gt; {
  console.log('1초마다 실행');
}, 1000);

const timeout2 = setTimeout(() =&amp;gt; {
  console.log('실행되지 않습니다');
}, 3000);

setTimeout(() =&amp;gt; {
  clearTimeout(timeout2);
  clearInterval(interval);
}, 2500);

const immediate = setImmediate(() =&amp;gt; {
  console.log('즉시 실행');
});

const immediate2 = setImmediate(() =&amp;gt; {
  console.log('실행되지 않습니다');
});

clearImmediate(immediate2);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1670431068224&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;즉시 실행 # 0초, immediate2는 바로 clearImmediate를 사용해서 취소했으므로 실행X
1초마다 실행 # interval
1.5초 후 실행 # timeout
1초마다 실행 # interval
# 2.5초가 지났을 때 clearTimeout과 clearInterval이 각각 timeout2와 interval을 취소&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;❗️setTimeout(콜백, 0)은 사용하지 않는게 좋다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- setImmediat(콜백)과 setTimeout(콜백, 0)에 담긴 콜백 함수는 같아 보이지만 파일 시스템 접근, 네트워킹 같은 I/O 작업의 콜백함수안에서 타이머를 호출하는 경우 setImmediate가 먼저 실행된다. 하지만 항상 먼저 실행되는 것은 아님! 그러므로 헷갈리지 않기 위해 setTimeout(콜백, 0)은 사용하지 않는 것을 권장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;__filename, __dirname&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각각 실행 시, 현재 파일명과 현재 파일 경로로 바뀜&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;module, exports&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- module.exports와 exports는 둘다 모듈을 만들 때 사용하지만, 차이점은 module.exports는 한번에 여러개 변수를 대입할 수 있는 반면 exports 객체에 각각의 변수를 하나씩 넣을 수 있다. &amp;rarr; &lt;b&gt;둘다 같은 객체를 참조&lt;/b&gt;하고 있기 때문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- exports는 module.exports를 참조하고 module.exports는 하나의 객체를 참조하므로 결국 exports도 그 객체를 참조하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이런 혼동을 막기 위해&lt;b&gt; exports 객체와 module.exports를 동시에 사용하지 않는 것이 좋다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;this&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- module.exports 또는 exports 객체를 가리킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 함수 선언문 내부의 this는 global 객체를 가리킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;require&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;// require.js
console.log('require가 가장 위에 오지 않아도 됩니다.');

module.exports = '저를 찾아보세요.';

require('./var');

console.log('require.cache입니다.');
console.log(require.cache);
console.log('require.main입니다.');
console.log(require.main === module);
console.log(require.main.filename);&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ node require
require가 가장 위에 오지 않아도 됩니다.
require.cache입니다.
[Object: null prototype] {
  'C:\\Users\\zerocho\\require.js': Module {
    id: '.',
    exports: '저를 찾아보세요.',
    parent: null,
    filename: 'C:\\Users\\zerocho\\require.js',
    loaded: false,
    children: [ [Module] ],
    paths: [
      'C:\\Users\\zerocho\\node_modules',
      'C:\\Users\\node_modules',
      'C:\\node_modules'
    ]
  },
  'C:\\Users\\zerocho\\var.js': Module {
    id: 'C:\\Users\\zerocho\\var.js',
    exports: { odd: '홀수입니다', even: '짝수입니다' },
    parent: Module {
      id: '.',
      exports: '저를 찾아보세요.',
      parent: null,
      filename: 'C:\\Users\\zerocho\\require.js',
      loaded: false,
      children: [Array],
      paths: [Array]
    },
    filename: 'C:\\Users\\zerocho\\var.js',
    loaded: true,
    children: [],
    paths: [
      'C:\\Users\\zerocho\\node_modules',
      'C:\\Users\\node_modules',
      'C:\\node_modules'
    ]
  }
}
require.main입니다.
true
C:\\Users\\zerocho\\require.js&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;require가 반드시 파일 최상단에 위치할 필요가 없음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;module.exports도 최하단에 위치할 필요가 없음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;require.cache&lt;/span&gt; : 파일에 대한 정보, 캐시형태로 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;require.main&lt;/span&gt; : 노드 실행 시 첫 모듈을 가리킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;require.main === module&lt;/span&gt; : 현재 파일이 첫 모듈인지 알아보기 위한 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;require.main.filename&lt;/span&gt; : 첫 모듈의 이름을 알아보기 위한 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;process.env&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시스템 환경 변수 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서비스의 중요한 키를 저장하는 공간으로도 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;process.nextTick(콜백)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이벤트 루프가 다른 콜백함수들보다 nextTick의&lt;b&gt; 콜백함수를 우선적으로 처리&lt;/b&gt;하도록 만듦.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- setImmediate나 setTimeout보다 먼저 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- resolve된 Promise도 다른 콜백들보다 우선시 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; nextTick과 Promise를 마이크로태스크라고 따로 구분지어 부름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;process.exit(코드)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실행 중인 노드 프로세스를 종료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;process&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 실행되고 있는 노드 프로세스에 대한 정보를 담음&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;$ node
&amp;gt; process.version
v14.0.0 // 설치된 노드의 버전입니다.
&amp;gt; process.arch
x64 // 프로세서 아키텍처 정보입니다. arm, ia32 등의 값일 수도 있습니다.
&amp;gt; process.platform
win32 // 운영체제 플랫폼 정보입니다. linux나 darwin, freebsd등의 값일 수도 있습니다.
&amp;gt; process.pid
14736 // 현재 프로세스의 아이디입니다. 프로세스를 여러 개 가질 때 구분할 수 있습니다.
&amp;gt; process.uptime()
199.36 // 프로세스가 시작된 후 흐른 시간입니다. 단위는 초입니다.
&amp;gt; process.execPath
C:\\Program Files\\nodejs\\node.exe // 노드의 경로입니다.
&amp;gt; process.cwd()
C:\\Users\\zerocho // 현재 프로세스가 실행되는 위치입니다.
&amp;gt; process.cpuUsage()
{ user: 390000, system: 203000 } // 현재 cpu 사용량입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Reference&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- Node.js 교과서 개정 2판&lt;/span&gt;&lt;/p&gt;</description>
      <category>Node.js</category>
      <category>node</category>
      <category>node.js</category>
      <category>노드 내장 객체</category>
      <author>yevdev</author>
      <guid isPermaLink="true">https://yexjinitlog.tistory.com/168</guid>
      <comments>https://yexjinitlog.tistory.com/168#entry168comment</comments>
      <pubDate>Thu, 8 Dec 2022 02:03:11 +0900</pubDate>
    </item>
  </channel>
</rss>