<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Jio.log</title>
        <link>https://velog.io/</link>
        <description>Quality Assurance Engineer | 브런치에서 TIL은 별로인걸</description>
        <lastBuildDate>Fri, 14 May 2021 08:15:11 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Jio.log</title>
            <url>https://images.velog.io/images/ji_o_ni/profile/fbcc7d0b-4a14-484e-901f-63a8d9b8b4bd/KakaoTalk_Photo_2021-04-03-14-07-54.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Jio.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ji_o_ni" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[TIL 10 | 지오 마켓 03 Axios로 네트워크 통신 후 상품 정보 불러오기]]></title>
            <link>https://velog.io/@ji_o_ni/TIL-10-%EC%A7%80%EC%98%A4-%EB%A7%88%EC%BC%93-03-Axios%EB%A1%9C-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%86%B5%EC%8B%A0-%ED%9B%84-%EC%83%81%ED%92%88-%EC%A0%95%EB%B3%B4-%EB%B6%88%EB%9F%AC%EC%98%A4%EA%B8%B0</link>
            <guid>https://velog.io/@ji_o_ni/TIL-10-%EC%A7%80%EC%98%A4-%EB%A7%88%EC%BC%93-03-Axios%EB%A1%9C-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%86%B5%EC%8B%A0-%ED%9B%84-%EC%83%81%ED%92%88-%EC%A0%95%EB%B3%B4-%EB%B6%88%EB%9F%AC%EC%98%A4%EA%B8%B0</guid>
            <pubDate>Fri, 14 May 2021 08:15:11 GMT</pubDate>
            <description><![CDATA[<h1 id="진행-상황">진행 상황</h1>
<p>javascript로 서버 구축 전, 포스트맨으로 임시 서버를 만든 상태.
<img src="https://images.velog.io/images/ji_o_ni/post/fc738532-31c3-43d3-bb4d-0ab215af401c/image.png" alt=""></p>
<h2 id="axiosget-사용-전-코드-상태">axios.get 사용 전 코드 상태</h2>
<pre><code class="language-javascript">  &lt;/body&gt;
  &lt;script&gt;
    var products = [
      {
        name: &quot;딸기&quot;,
        price: &quot;3,800,000&quot;,
        seller: &quot;지오&quot;,
        imageUrl: &quot;images/products/product1.png&quot;,
      },
      {
        name: &quot;포도&quot;,
        price: &quot;4,500,000&quot;,
        seller: &quot;지오&quot;,
        imageUrl: &quot;images/products/product2.png&quot;,
      },
      {
        name: &quot;자몽&quot;,
        price: &quot;9,800,000&quot;,
        seller: &quot;지오&quot;,
        imageUrl: &quot;images/products/product3.png&quot;,
      },
      {
        name: &quot;이름모를과일&quot;,
        price: &quot;10,800,000&quot;,
        seller: &quot;지오&quot;,
        imageUrl: &quot;images/products/product4.png&quot;,
      },
    ];
    let productsHtml = &quot;&quot;;
    for (var i = 0; i &lt; products.length; i++) {
      let product = products[i];
      productsHtml =
        productsHtml +
        &#39;&lt;div class=&quot;product-card&quot;&gt;&#39; +
        &quot;&lt;div&gt;&quot; +
        &#39;&lt;img class=&quot;product-img&quot; src=&quot;&#39; +
        product.imageUrl +
        &#39;&quot; /&gt;&#39; +
        &quot;&lt;/div&gt;&quot; +
        &#39;&lt;div class=&quot;product-contents&quot;&gt;&#39; +
        &#39;&lt;span class=&quot;product-name&quot;&gt;&#39; +
        product.name +
        &quot;&lt;/span&gt;&quot; +
        &#39;&lt;span class=&quot;product-price&quot;&gt;&#39; +
        product.price +
        &quot; USD&quot; +
        &quot;&lt;/span&gt;&quot; +
        &#39;&lt;div class=&quot;product-seller&quot;&gt;&#39; +
        &#39;&lt;img class=&quot;product-avatar&quot; src=&quot;images/icons/avatar2.png&quot; /&gt;&#39; +
        &quot;&lt;span&gt;&quot; +
        product.seller +
        &quot;&lt;/span&gt;&quot; +
        &quot;&lt;/div&gt;&quot; +
        &quot;&lt;/div&gt;&quot; +
        &quot;&lt;/div&gt;&quot;;
    }
    document.querySelector(&quot;#product-list&quot;).innerHTML = productsHtml;
  &lt;/script&gt;
&lt;/html&gt;</code></pre>
<h1 id="axios-네트워크-통신-과정">Axios 네트워크 통신 과정</h1>
<h2 id="1-헤더에-axios-외부-javascript-링크-추가">1. 헤더에 axios 외부 javascript 링크 추가</h2>
<pre><code class="language-javascript">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;지오마켓&lt;/title&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;index.css&quot; type=&quot;text/css&quot; /&gt;
    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js&quot;&gt;&lt;/script&gt;
  &lt;/head&gt;</code></pre>
<h2 id="2-axiosget-추가">2. axios.get 추가</h2>
<p><img src="https://images.velog.io/images/ji_o_ni/post/80324702-b32f-4299-a7aa-78e2620f8003/image.png" alt="">
URL은 포스트맨에서 만들어둔 mock-server의 값을 사용.</p>
<pre><code class="language-javascript">  &lt;script&gt;
    axios
      .get(
        &quot;https://9baa770d-8de3-44ea-985e-7e792bae921d.mock.pstmn.io/products&quot;
      )
      .then(function (result) {
        console.log(&quot;통신 결과 : &quot;, result);
      })
      .catch(function (error) {
        console.error(&quot;에러 발생 : &quot;, error);
      });</code></pre>
<p>사이트 로딩 시 위 스크립트 실행 후 네트워크 통신이 끝나면 result에 값이 들어오게 됨. 비동기 통신이기 때문에 하단 작업들은 실행됨.
<img src="https://images.velog.io/images/ji_o_ni/post/1ba54e56-456a-4b91-99dc-6c85868e589f/image.png" alt=""></p>
<h2 id="3-완성">3. 완성</h2>
<pre><code class="language-javascript">  &lt;/body&gt;
  &lt;script&gt;
    axios
      .get(
        &quot;https://9baa770d-8de3-44ea-985e-7e792bae921d.mock.pstmn.io/products&quot;
      )
      .then(function (result) {
        console.log(&quot;통신 결과 : &quot;, result);
        const products = result.data.products;
        let productsHtml = &quot;&quot;;
        for (var i = 0; i &lt; products.length; i++) {
          let product = products[i];
          productsHtml =
            productsHtml +
            &#39;&lt;div class=&quot;product-card&quot;&gt;&#39; +
            &quot;&lt;div&gt;&quot; +
            &#39;&lt;img class=&quot;product-img&quot; src=&quot;&#39; +
            product.imageUrl +
            &#39;&quot; /&gt;&#39; +
            &quot;&lt;/div&gt;&quot; +
            &#39;&lt;div class=&quot;product-contents&quot;&gt;&#39; +
            &#39;&lt;span class=&quot;product-name&quot;&gt;&#39; +
            product.name +
            &quot;&lt;/span&gt;&quot; +
            &#39;&lt;span class=&quot;product-price&quot;&gt;&#39; +
            product.price +
            &quot; USD&quot; +
            &quot;&lt;/span&gt;&quot; +
            &#39;&lt;div class=&quot;product-seller&quot;&gt;&#39; +
            &#39;&lt;img class=&quot;product-avatar&quot; src=&quot;images/icons/avatar2.png&quot; /&gt;&#39; +
            &quot;&lt;span&gt;&quot; +
            product.seller +
            &quot;&lt;/span&gt;&quot; +
            &quot;&lt;/div&gt;&quot; +
            &quot;&lt;/div&gt;&quot; +
            &quot;&lt;/div&gt;&quot;;
        }
        document.querySelector(&quot;#product-list&quot;).innerHTML = productsHtml;
      })
      .catch(function (error) {
        console.error(&quot;에러 발생 : &quot;, error);
      });
  &lt;/script&gt;
&lt;/html&gt;</code></pre>
<ol>
<li>script 태그에 axios 네트워크 통신하는 코드 작성.</li>
<li>비동기 처리, 프로미스 객체이므로 then과 catch 사용.</li>
<li>네트워크 통신이 정상이면 콜백 함수 실행, result 받음.</li>
<li>result.data.products 객체에 접근 후 products 변수에 담고</li>
<li>productsHtml 값에 문자 형태로 태그들을 넣어주고</li>
<li>html 태그 접근 후 innerHTML로 값을 넣어준다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 09 | JSON?]]></title>
            <link>https://velog.io/@ji_o_ni/TIL-09-JSON</link>
            <guid>https://velog.io/@ji_o_ni/TIL-09-JSON</guid>
            <pubDate>Fri, 14 May 2021 06:31:27 GMT</pubDate>
            <description><![CDATA[<p><code>JSON</code>은 JavaScript Object Notation의 약자이다. 데이터 저장 또는 전송할 때 많이 사용하는 DATA 형식이다. 즉 네트워크 통신에 필요한 데이터를 주고받거나, 개발 과정에서 간단한 데이터를 저장하는 경우에 사용한다.</p>
<p><code>JSON</code>은 JavaScript 객체 표현식이 기본이라서 네트워크 통신을 통해 json 데이터를 받으면 JavaScript 객체로 쉽게 변환이 가능하다. 또한 JavaScript 객체를 json으로 변환하는 것도 쉽게 가능하다.</p>
<h1 id="규칙">규칙</h1>
<ol>
<li>key : value 형태이다. key는 항상 <code>&quot;&quot;</code> 로 표현한다.</li>
<li>value에는 문자열, 숫자, 배열, 객체를 넣을 수 있다.</li>
<li>값을 나열할 때 <code>,</code> 를 사용하고, 마지막엔 <code>,</code> 를 넣지 않는다.<pre><code class="language-json">{
 &quot;name&quot; : &quot;딸기&quot;,
 &quot;price&quot; : 150000,
 &quot;seller&quot; : {
     &quot;name&quot; : &quot;지오&quot;,
     &quot;email&quot; : &quot;easyone.jio@gmail.com
 }
}</code></pre>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 08 | Postman mock server 만들어보기]]></title>
            <link>https://velog.io/@ji_o_ni/TIL-08-Postman-mock-server-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@ji_o_ni/TIL-08-Postman-mock-server-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Sun, 09 May 2021 14:40:45 GMT</pubDate>
            <description><![CDATA[<p>API Test Tool인 Postman으로 mock server를 만들어보았다. 아래의 INITIAL VALUE 값을 URL로 사용할 수 있다.</p>
<p><img src="https://images.velog.io/images/ji_o_ni/post/a3b50a1e-c67b-4326-b72b-2bb0232740b6/image.png" alt=""></p>
<h1 id="어떤-응답을-줄-것인가">어떤 응답을 줄 것인가?</h1>
<p><img src="https://images.velog.io/images/ji_o_ni/post/0f2cf613-da62-4c73-b25c-1ed80fd9637b/image.png" alt=""></p>
<h1 id="통신-결과-받아보기">통신 결과 받아보기</h1>
<p><img src="https://images.velog.io/images/ji_o_ni/post/b3643e4d-9664-4f9e-ad16-57f4cc36048d/image.png" alt="">
SEND를 누르면 Body에 위 결과가 나타난다.
<img src="https://images.velog.io/images/ji_o_ni/post/b8a5eb8a-484e-4a7e-828f-ff9a864aad6b/image.png" alt="">
INITIAL VALUE 값의 URL로 접속하면 위 결과가 나타난다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 07 | Axios 통신 ]]></title>
            <link>https://velog.io/@ji_o_ni/TIL-07-Axios-%ED%86%B5%EC%8B%A0-%ED%95%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@ji_o_ni/TIL-07-Axios-%ED%86%B5%EC%8B%A0-%ED%95%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Sun, 09 May 2021 13:55:55 GMT</pubDate>
            <description><![CDATA[<h1 id="외부-라이브러리-사용">외부 라이브러리 사용</h1>
<p>axios를 사용하려면 아래 코드를 불러오면 된다. 
<strong>Using jsDelivr CDN:</strong></p>
<pre><code>&lt;script src=&quot;https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js&quot;&gt;&lt;/script&gt;</code></pre><h1 id="axios-통신">Axios 통신</h1>
<p>axios는 기본적으로 비동기 처리를 하는 <strong>promise 객체를 리턴한다.</strong></p>
<pre><code class="language-javascript">// 예시
axios.get(url주소) 
axios.post(url주소,data 객체) 

//기axios 메소드는 promise 객체를 return
axios.get(url주소).then(function(result){
    //result 객체에는 status, data와 같은 정보가 들어감.
}).catch(function(error){

})</code></pre>
<p>아래와 같이 사용할수 있다.</p>
<pre><code class="language-javascript">&lt;html&gt;
  &lt;head&gt;
    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
      axios
        .get(&quot;https://jsonplaceholder.typicode.com/todos/1&quot;)
        .then(function (result) {
      // callback 구조이고 result에 통신 결과가 들어옴.
      // 아래 코드는 status code와 응답 데이터가 들어감.
          console.log(&quot;status code : &quot;, result.status);
          console.log(&quot;data : &quot;, result.data);
        })
        .catch(function (err) {
      // 에러 발생 시 err에 관련 정보 들어감.
      // 에러 미발생 시 아래 코드는 실행되지 않음.
          console.log(&quot;에러 발생! : &quot;, err);
        });
      console.log(&quot;즉시 실행&quot;);
    &lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>Devtools 켜보면 아래와 같이 status code와 data 정보가 나타남.
<img src="https://images.velog.io/images/ji_o_ni/post/3e47b6a4-c388-4cba-83a1-1d23959e95a8/image.png" alt=""></p>
<hr>
<p><strong>참고 사이트</strong>
<a href="https://jsonplaceholder.typicode.com/">https://jsonplaceholder.typicode.com/</a>
<a href="https://github.com/axios/axios">https://github.com/axios/axios</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 06 | Javascript 비동기 처리 개념]]></title>
            <link>https://velog.io/@ji_o_ni/TIL-06-Javascript-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC-%EA%B0%9C%EB%85%90</link>
            <guid>https://velog.io/@ji_o_ni/TIL-06-Javascript-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC-%EA%B0%9C%EB%85%90</guid>
            <pubDate>Sun, 09 May 2021 09:45:31 GMT</pubDate>
            <description><![CDATA[<h1 id="기본-개념">기본 개념</h1>
<p>자바스크립트의 코드 인터프리터는 브라우저 내부에 탑재되어 있다. 자바스크립트 코드를 브라우저에서 실행시키기 위해서다. 그런데 만약 특정 코드에서 결과를 얻기까지 오랜 시간이 걸린다면, 아래 코드는 실행이 안되므로 정상 동작하지 않을 것이다. 대표적으로 네트워크 통신과 복잡한 계산을 실행하는 코드가 있다. 이를 해결하기 위해 자바스크립트는 비동기 방식을 지원한다. 비동기 처리가 적용된 코드는, 실행이 되면 다음 코드가 실행되고, 결과를 얻으면 인터프리터가 다른 코드를 처리하다가, 중간에 비동기 처리의 결과를 처리하게 된다.</p>
<pre><code class="language-javascript">//비동기 처리 방식인 setTimeout
setTimeout(function(){
    console.log(&#39;3초 후 실행&#39;);
}, 3000)
console.log(&#39;먼저 실행&#39;);</code></pre>
<p><img src="https://images.velog.io/images/ji_o_ni/post/52bb0c0f-f04a-4afc-a86d-cede81fc2d26/image.png" alt=""></p>
<h1 id="promise-객체">Promise 객체</h1>
<p>Promise 객체는 javascript에서 비동기 처리를 지원하는 객체 중 하나이다. 정상 실행이 끝난 후 실행되는 <code>then</code> 함수(메소드)와 에러 발생 시 실행되는 <code>catch</code> 함수를 가지고 있다. 대표적으로 사용하는 Promise 객체는 <code>fetch</code> 함수가 있고, fetch는 네트워크 통신 함수이다.</p>
<pre><code class="language-javascript">fetch(&#39;URL 주소&#39;)
.then(function(response){ //then 함수에 callback 함수를 입력
    //응답받을 때 수행하는 코드 작성
    //정상 실행 시 response에는 fetch의 결과가 들어감.
})
.catch(err =&gt; {  //catch 함수에는 callback 함수를 입력
    //비동기 작업 실패 시 수행하는 코드 작성
    //err에는 에러 관련 정보들이 들어감.
})
console.log(&#39;네트워크 통신 완료 여부 관계없이 바로 실행&#39;);
console.log(&#39;네트워크 통신 완료 여부 관계없이 바로 실행&#39;);</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 05 | Javascript 콜백 함수 기본 개념]]></title>
            <link>https://velog.io/@ji_o_ni/TIL-05-Javascript-%EC%BD%9C%EB%B0%B1-%ED%95%A8%EC%88%98-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90</link>
            <guid>https://velog.io/@ji_o_ni/TIL-05-Javascript-%EC%BD%9C%EB%B0%B1-%ED%95%A8%EC%88%98-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90</guid>
            <pubDate>Sun, 09 May 2021 09:14:44 GMT</pubDate>
            <description><![CDATA[<p>함수는 매개변수(Parameter)를 넣을 수 있고, 값을 반환할 수 있다. 콜백 함수는 함수가 나중에 불린다고 해서 붙여진 이름(CallBack)이다. 보통 콜백 함수는 함수의 인자(Argument)에 함수를 넣는 방식으로 사용한다. 콜백 함수는 자바스크립트의 비동기 처리 방식의 문제점을 해결해주기 위해 특정 시점에서 호출되도록 사용하는 함수이다. 이때 비동기 처리 방식의 문제점은 특정 코드의 연산이 끝날 때까지 실행을 멈추지 않고 다음 코드를 먼저 실행하는 자바스크립트의 특성을 의미한다.</p>
<pre><code class="language-javascript">function sayHello(){ 
  console.log(&#39;안녕하세요 지오입니다.&#39;);
}

function sayCallback(callback){ 
  callback(); 
}

sayCallback(sayHello) </code></pre>
<ol>
<li>sayHello 함수를 만들어 준다.</li>
<li>sayCallback 함수의 파라미터에 callback 함수가 들어간다.</li>
<li>sayCallback의 파라미터인 callback에는 sayHello가 들어가고, 그 결과 sayHello가 실행되므로, 안녕하세요 지오입니다. 가 출력된다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 04 | 클라이언트와 서버, HTTP 통신 기초 정리]]></title>
            <link>https://velog.io/@ji_o_ni/TIL-04-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EC%99%80-%EC%84%9C%EB%B2%84-HTTP-%ED%86%B5%EC%8B%A0-%EA%B8%B0%EC%B4%88-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@ji_o_ni/TIL-04-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EC%99%80-%EC%84%9C%EB%B2%84-HTTP-%ED%86%B5%EC%8B%A0-%EA%B8%B0%EC%B4%88-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 09 May 2021 08:37:55 GMT</pubDate>
            <description><![CDATA[<h1 id="클라이언트와-서버">클라이언트와 서버</h1>
<h2 id="클라이언트client와-서버server">클라이언트(Client)와 서버(Server)</h2>
<p>클라이언트는 정보를 요청하고, 서버는 요청한 정보를 제공한다. 정보를 불러오고 사용자의 요청을 처리하기 위해 파일 서버, 인증 서버, API 서버와 네트워크 통신을 하게 된다.</p>
<h1 id="http-통신">HTTP 통신</h1>
<h2 id="개요">개요</h2>
<p>네트워크 통신은 여러가지 방식이 있다. 이러한 방식들을 묶어서 통신 프로토콜이라 부르고, 메일 주고 받을때 사용하는 SMTP 프로토콜, 파일 전송에 사용하는 FTP 프로토콜 등이 있다. HTTP 프로토콜은 브라우저가 웹 서버와 통신을 하기 위해 생겨난 프로토콜이다. 대부분의 네트워크 통신에 사용하는 대중적인 프로토콜이다. 이때 HTTP 프로토콜을 활용한 통신이 바로 HTTP 통신이다.</p>
<h2 id="요청request과-응답response">요청(request)과 응답(response)</h2>
<p>HTTP 통신은 기본적으로 요청(request)과 응답(response)로 나눈다. 요청과 응답 모두 공통적으로 요청 라인, 헤더, 바디의 구조를 지닌다. 요청 라인에는 URL, Method와 같은 핵심 요청 정보가 포함된다. 이는 요청과 응답에 따라 구성 요소가 달라진다. 헤더에는 HTTP 설정 값들이 포함되고, 바디에는 통신에 필요한 데이터가 들어간다. HTTP 통신으로 서버에게 정보를 요청하기 위해서는 몇가지 규칙을 지켜야 하는데, 첫번째로 URL이 있어야 하고, 어떤 방식으로 통신 할것인지에 대한 Method가 있어야 한다.</p>
<h2 id="http-method">HTTP Method</h2>
<p>클라이언트가 서버에게 HTTP 요청을 하려면, URL 주소와 HTTP Method를 정해야 한다. 서버에서는 Method에 따라 어떤 요청인지 파악이 가능하다. 대표적으로 GET, POST가 존재한다. 재밌는 점은 클라이언트가 서버에게 동일한 URL 주소로 요청하더라도, 서버 입장에서는 Method가 다르면 다른 요청으로 간주하고 처리하게 된다. </p>
<h2 id="get">GET</h2>
<p>일반적으로 정보를 받아올때 사용한다. 요청 시 Method 설정을 안하면 기본 Method로 GET이 들어간다. 웹서버에서 웹을 다운받거나, 상품 정보들을 받아올때 GET을 사용한다. GET 방식은 서버에 데이터를 전송해야 할 때 url 끝에 <code>query</code> 라는 것을 붙인다.  query는 <code>key=value</code> 형태로 구성되어 있다.</p>
<h2 id="post">POST</h2>
<p>새로운 자원을 생성할때 사용한다. 대표적으로 로그인, 상품 업로드, 결제하기 등 정보를 담아서 보내야하는 경우 많이 사용한다. POST도 GET과 마찬가지로 URL 뒤에 query를 붙일 수 있다. 또한 GET은 Body에 데이터를 담을 수 없지만, POST는 HTTP <code>Body</code> 부분에 데이터를 담을 수 있다. Body는 HTTP 통신에 구조적으로 데이터를 담아서 전송할수 있게 도와주는 역할을 한다.  </p>
<h2 id="http-응답">HTTP 응답</h2>
<p>응답 규칙은 아래와 같다.</p>
<ol>
<li>어떤 상태인지에 대한 정보 <code>Status Code</code> </li>
<li><code>Body</code>에 요청 결과를 담아야 함.</li>
</ol>
<p>이때 <code>Status Code</code> 는 200~ 500 번까지 있으며 서버의 응답에 대한 상태를 표현한다.
요청 코드를 크게 나눠보면 아래와 같다.</p>
<p><code>200</code> ~ 정상적으로 응답을 했을 때.
<code>400</code> ~ 클라이언트가 요청을 잘못했을 때.
<code>500</code> ~ 서버에서 에러가 발생했을 때.</p>
<p>대표적인 응답 코드는 아래와 같다.</p>
<p><strong>200</strong> : 정상
<strong>404</strong> : URL 요청을 처리 불가
<strong>500 :</strong> 서버 에러 발생</p>
<p><a href="https://developer.mozilla.org/ko/docs/Web/HTTP/Status">https://developer.mozilla.org/ko/docs/Web/HTTP/Status</a>
더 많은 HTTP 상태 코드는 위 공식 문서에 정리되어 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 03 | Mac OS 아나콘다 Jupyter Notebook Lunch 경로 에러 해결하기]]></title>
            <link>https://velog.io/@ji_o_ni/Mac-OS-%EC%95%84%EB%82%98%EC%BD%98%EB%8B%A4-Jupyter-Notebook-Lunch-%EA%B2%BD%EB%A1%9C-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@ji_o_ni/Mac-OS-%EC%95%84%EB%82%98%EC%BD%98%EB%8B%A4-Jupyter-Notebook-Lunch-%EA%B2%BD%EB%A1%9C-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 06 May 2021 14:07:30 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Mac OS 아나콘다 Jupyter Notebook 경로 오류 해결 방법을 작성하였다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/ji_o_ni/post/a34b31ea-1a2d-474c-a9f2-bf75078b60b9/image.png" alt="">
코드를 한 줄씩 작성 및 실행하여 결과 확인 가능하고, 문서처럼 코드를 작성하여 정리해 볼 수 있는 유용한 툴인 Juptyter Notebook 활용하고자 아나콘다를 설치했다. 아나콘다는 파이썬 컴파일러 또는 Juptyter Notebook과 같은 주요 라이브러리를 한꺼번에 설치해 주므로 편리하다.</p>
<p>그런데 사진 속 Juptyter Notebook의 Lanch를 눌렀더니, 아나콘다 no such file or directory 오류로 실행이 안 되었고, 해결 방법을 정리하게 되었다.</p>
<h1 id="원인">원인</h1>
<p>정확한 것은 아니지만 아나콘다 네비게이터 설치 시, 대상 디스크 선택란에 <strong>사용자 본인 전용</strong>과 <strong>특정 디스크에 설치</strong>가 존재했고, *<em>사용자 본인 전용으로 설치한 게 문제가 된 것 같다. *</em></p>
<p>발생한 오류가, <a href="https://youngq.tistory.com/78">https://youngq.tistory.com/78</a> 해당 블로그의 현상과 가장 유사하여, 환경 변수 설정에 문제가 있는 것 같아 추가 조사 중, <a href="https://acdongpgm.tistory.com/120">https://acdongpgm.tistory.com/120</a> 블로그를 발견하였고, 참고하여 아래와 같이 해결하였다.</p>
<h1 id="해결-순서">해결 순서</h1>
<h2 id="선택아나콘다-라이브러리-업데이트">(선택)아나콘다 라이브러리 업데이트</h2>
<p><img src="https://images.velog.io/images/ji_o_ni/post/7b45cf71-edda-4a1c-93ec-dd43b5b39184/image.png" alt=""></p>
<pre><code>conda upgrade --all </code></pre><p>환경 변수 설정 문제와 크게 관련 없어 보이지만, Mac OS로 아나콘다를 설치하고 Jupyter Notebook을 실행하면 500 error 발생하여 사용하기도 전에 엄청 고생했다는 포스팅을 발견하여 라이브러리 업데이트를 해주었다.</p>
<h2 id="1-아나콘다-설치-경로로-이동">1. 아나콘다 설치 경로로 이동</h2>
<p>환경 변수 설정을 해야 하기 때문에 우선 아나콘다가 설치된 경로로 이동해 준다.</p>
<pre><code>/Users/사용자 이름/opt/anaconda3 </code></pre><h2 id="2-환경변수-설정">2. 환경변수 설정</h2>
<p>터미널에 아래와 같이 입력해 준다.</p>
<pre><code>$ echo &#39;export PATH=&quot;/Users/사용자 이름/opt/anaconda3/bin:$PATH&quot;&#39; &gt;&gt; ~/,bashrc
$ echo &#39;export PATH=&quot;/Users/사용자 이름/opt/anaconda3/bin:$PATH&quot;&#39; &gt;&gt; ~/,zshrc
$ source ~/.bashrc
$ source ~/.zshrc</code></pre><h2 id="3-재실행">3. 재실행</h2>
<p><img src="https://images.velog.io/images/ji_o_ni/post/fe3da88e-1105-44b1-b07b-9ae7cf09a63d/image.png" alt="">
성공!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 02 | 지오 마켓 02 Javascript로 HTML CSS 조작하기]]></title>
            <link>https://velog.io/@ji_o_ni/TIL-02-%EC%A7%80%EC%98%A4-%EB%A7%88%EC%BC%93-02-Javascript%EB%A1%9C-HTML-CSS-%EC%A1%B0%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@ji_o_ni/TIL-02-%EC%A7%80%EC%98%A4-%EB%A7%88%EC%BC%93-02-Javascript%EB%A1%9C-HTML-CSS-%EC%A1%B0%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 06 May 2021 06:56:37 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>인프런 강의에서 학습한 내용을 정리하고 복습한다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/ji_o_ni/post/8eee767e-9bcc-4235-9c21-85dafdc67740/image.png" alt="">
 1편에서 HTML과 CSS로 상품 레이아웃을 연습하고 마켓 제작에 필요한 자바스크립트 기초를 학습하였다. 오늘은 학습한 자바스크립트를 활용하여 정적인 데이터들을 동적인 데이터로 바꿔보았다. </p>
<p>진행한 내용을 정리해두니 정리하는 과정에서 한번 더 생각하게 되고, 자기 전에 복습 용도로 활용이 가능할 뿐 아니라, 이동 중에도 모바일로 볼 수 있어서 큰 도움이 되고 있다. </p>
<p>현재 듣고 있는 인프런 강의 과정이 모두 끝나면 프론트와 백엔드 중 집중 학습할 분야가 정해질 것 같다. 현재 얇고 넓게 학습하는 이유는 재밌고 흥미 있는 분야를 찾기 위해서다. 그러려면 직접 해보는 것이 중요하다. 일단 스스로가 재밌어야 꾸준히 할 수 있다. 꾸준히 지속 가능한 환경과 학습 방향을 찾아가는 것이 목표다.</p>
<p>마음 끌리는 분야가 정해지면 다시 기초부터 관련 기술 스택들을 T자형으로 깊게 학습할 예정이다.</p>
<hr>
<h1 id="정적-데이터와-동적-데이터">정적 데이터와 동적 데이터</h1>
<p><img src="https://images.velog.io/images/ji_o_ni/post/3a25e346-6cfa-4f2c-901a-2c68ce656700/image.png" alt=""> <img src="https://images.velog.io/images/ji_o_ni/post/d2dca984-55f5-488a-a255-86d6cfae34b9/image.png" alt="">
위 사진은 1편에서 만들었던 HTML 구조와 웹에 보이는 모습이다. product-img, product-name, product-price, product-seller, product-avatar 정보들은 HTML과 CSS 연습을 위해 임의로 적어둔 데이터들이다. 해당 정보를 지우면 안 보이고 다시 값을 넣으면 보이는 정적인 데이터이다.</p>
<p>그런데 신상품(2편에서는 특가 상품으로 이름 변경) 신상품 아래 상품들은 마켓 특성상 언제든 바뀔 수 있고, 바뀌어야 한다. 상품 업로드 기능을 구현하게 되면 그때마다 상품들이 자동으로 바뀌어야 하므로 HTML 구조 또한 자동으로 바뀌어야 한다. </p>
<p>따라서 마켓 기능을 갖추기 위해 1편에서 학습한 자바스크립트 기초 문법을 활용하여 상품 정보를 정적인 데이터에서 동적인 데이터로 만들어보았다. </p>
<hr>
<h1 id="script에-배열-만들기">script에 배열 만들기</h1>
<p>나중에 네트워크 통신을 통해 상품 데이터를 받을 예정이다. 우선 상품 데이터를 받았다고 가정하고 script 안에 배열을 만들어 준다. 앞서 배운 자바스크립트 기초 문법을 지오 마켓 제작에 활용한 것이다.
<img src="https://images.velog.io/images/ji_o_ni/post/2fd1343d-977b-49d2-92b8-dae78ec76a09/image.png" alt=""></p>
<hr>
<h1 id="자바스크립트로-html-css-조작하기">자바스크립트로 HTML, CSS 조작하기</h1>
<p>위에 만들어둔 products 데이터를 바탕으로 상품 정보들을 만들기 위해선 자바스크립트로 HTML과 CSS 조작이 필요하다. 현재 조작 필요한 콘텐츠는 우측 사진 product-list 안의 콘텐츠이다. 해당 콘텐츠를 조작하기 위해 document.querySelector와 innerHTML을 활용하였다. 
<img src="https://images.velog.io/images/ji_o_ni/post/5b7b7dee-5128-4bbf-aa6b-1911d5c44e16/image.png" alt=""><img src="https://images.velog.io/images/ji_o_ni/post/802b54bd-2db6-48aa-8781-3d3a989e9a80/image.png" alt="">
아래와 같이 변수와 반복문을 활용하여 productsHtml에 태그들을 더하고, 변경된 데이터가 나타날 수 있도록 만들어보았다.
<img src="https://images.velog.io/images/ji_o_ni/post/110df35e-48c6-4a3b-b74f-571b0f1a15b6/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 01 | 지오 마켓 01 HTML CSS Javascript 
Basics]]></title>
            <link>https://velog.io/@ji_o_ni/%EC%A7%80%EC%98%A4-%EB%A7%88%EC%BC%93-01-HTML-CSS-Javascript-Basics</link>
            <guid>https://velog.io/@ji_o_ni/%EC%A7%80%EC%98%A4-%EB%A7%88%EC%BC%93-01-HTML-CSS-Javascript-Basics</guid>
            <pubDate>Thu, 06 May 2021 06:08:54 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>인프런 강의에서 학습한 내용을 정리하고 복습한다.</p>
</blockquote>
<h1 id="html-css">HTML CSS</h1>
<p><img src="https://images.velog.io/images/ji_o_ni/post/3029d8c4-8575-4eb6-8b85-b8217d798c72/image.png" alt="">
HTML 요소들을 자유자재로 배치하기 위한 방법에는 여러 가지가 있는데, Flex를 활용하여 HTML 요소를 정렬했다. Flex의 핵심은 Container(부모)와 Item이라 생각되고, Container(부모)의 첫째 자식인 Item들을 Flex를 통해 정렬할 수 있다. Flex 정렬은 Container(부모) 기준으로 자식을 정렬하기 때문에 이점을 고려해서 사용해야 한다.
<img src="https://images.velog.io/images/ji_o_ni/post/e65b763c-3d8a-4614-9b26-d7fe164e14ce/image.png" alt="">
위 HTML 코드는 상품을 나타내고 정렬시키기 위한 뼈대이다. product-list라는 id 선택자에 상품 정보를 담을 수 있는 product-card class를 만들었고, 그 안에 img, contents, name, price, seller, avatar와 같은 요소들을 클래스로 만들었다.  </p>
<p>product-list라는 선택자를 제외한 요소들은 지오 마켓에서 공통적으로 사용할 상품 뼈대이므로 class를 활용했고, 1개의 뼈대를 잡아두면 나머지 상품들은 복사 붙여 넣기로 추가가 가능했다.  </p>
<p>product-list라는 Container(부모) 안에, product-card라는 첫째 자식이 있고, 정렬 필요한 부분은 아래와 같다.</p>
<ul>
<li>상품 이미지(product-img)</li>
</ul>
<p>이때 아래와 같이 product-list라는 Container(부모)에 display: flex;를 줘야, 상품 이미지(product-img)의 부모인 product-card 요소가, flex 상태가 되면서 원하는 정렬이 가능해진다.
<img src="https://images.velog.io/images/ji_o_ni/post/a38c9243-cfe6-44a9-8214-71685700c208/image.png" alt="">
만약 부모를 flex로 만들지 않고, 중앙 정렬을 시키고 싶다면, 아래와 같이 중앙 정렬시키고 싶은 요소의 margin 값을 0 auto로 주면 된다. 상황에 따라 적절하게 사용하면 좋았다.
<img src="https://images.velog.io/images/ji_o_ni/post/26e585fb-eaa4-4a59-8ba5-03ed2718491d/image.png" alt=""></p>
<hr>
<h1 id="javascript">Javascript</h1>
<h2 id="변수자료형">변수&amp;자료형</h2>
<h3 id="변수-선언">변수 선언</h3>
<p>변수 선언은 어떤 변수를 사용할지 정하는 작업이다. javascript는 const, var, let을 사용한다.</p>
<h3 id="변수-정의">변수 정의</h3>
<p>변수 정의는 선언된 변수에 값을 넣는 작업이다.</p>
<h3 id="변수-선언정의-정리">변수 선언&amp;정의 정리</h3>
<p><img src="https://images.velog.io/images/ji_o_ni/post/6a3f41b8-1a09-4755-9f34-1514f0d3e38e/image.png" alt=""></p>
<h3 id="변수명camelcase와-snake_case">변수명(camelCase와 snake_case)</h3>
<p>변수명은 영문과 숫자로 지어야 하고, 띄어쓰기와 특수문자는 불가하다. 변수명 작성은 camelCase 또는 snake_case 형태로 짓는 게 좋다.
<img src="https://images.velog.io/images/ji_o_ni/post/5a565e28-a36a-4fb3-95f0-a794a083ffd0/image.png" alt=""></p>
<h3 id="자료형">자료형</h3>
<p>기본 자료형(Primitive Type)은 모든 프로그래밍 언어의 공통된 요소이다. string(문자), number(숫자), boolean(참/거짓)이 존재하고, javascript에는 null과 undefined 자료형도 존재한다. 보통 null은 값이 없을 때 사용하고 undefined는 변수를 선언만 하고 정의하지 않은 상태일 때 사용한다. 또한 변수의 자료형을 확인하는 문법으로 typeof 가 존재한다.
<img src="https://images.velog.io/images/ji_o_ni/post/6a48b820-d27d-4c8b-aec5-62cdaf5c0ee6/image.png" alt=""></p>
<h3 id="array배열">Array(배열)</h3>
<p>Array는 object(객체)의 종류 중 하나로 object 자료형이다. 배열 또는 리스트(List)로도 불리는데, 데이터를 순차적으로 담을 때 사용한다. 지오 마켓 상품 정보들을 사용자에게 보여주려면, 상품 정보들이 배열에 담겨야 한다. 배열을 사용할 때는 Bracket([])을 사용하는데, 배열의 길이를 알고 싶다면. length, 값을 조회하려면 [순서], 새로운 값을 추가하려면. push(값)을 사용하면 된다. [추가할 순서]도 사용이 가능하지만, 선호하는 방식은 아니다. 또한 배열에는 숫자형, 문자형과 같은 모든 자료형을 넣을 수 있고, 배열 안에 배열 또한 가능하다. 
<img src="https://images.velog.io/images/ji_o_ni/post/89438c81-4b4a-4f90-85d8-10e63a886355/image.png" alt=""></p>
<h3 id="객체object">객체(object)</h3>
<p>객체는 key, value 형태로 자료를 저장하는 자료형이다. 지오 마켓 상품에는 상품 제목, 가격 등의 데이터가 들어갈 텐데 product라는 객체 안에 상품 이름(name)과 가격(price)을 넣게 된다.
<img src="https://images.velog.io/images/ji_o_ni/post/ca2ed1a3-d489-4715-9a38-f7898f4c71b9/image.png" alt="">
예를 들어 아래와 같은 객체를 생성하고 name 값을 가져오고 싶다면, 배열에서 값을 가져오는 방식처럼 [] 안에 key 값을 넣어준다. 또는 객체. key 방법으로도 값을 가져올 수 있다.
<img src="https://images.velog.io/images/ji_o_ni/post/2820b916-0790-457e-aad4-24bce397eac4/image.png" alt="">
과정을 살펴보면, 먼저 name, description, price 정보가 담긴 product라는 객체를 생성하였다. 이후 객체 안의 name 정보인 딸기를, productName 변수에 넣어주기 위해 배열에서 값을 가져오는 방식처럼 product [&#39;name&#39;];을 해주었다. 따라서 productName에 product 객체 안의 name값이 저장되어 딸기가 출력된다.</p>
<p>또한 객체. key 방법으로도 값을 가져올 수 있다. 생성된 객체는 위와 동일하고, productDescription 변수에 객체의 description 값인 싱싱한 딸기를 넣어주기 위해 product.description을 하였다. 따라서 값이 저장되었으므로 productDescription을 하면 싱싱한 딸기가 출력된다.
<img src="https://images.velog.io/images/ji_o_ni/post/9b021244-a266-43f2-b217-57c9aeebd617/image.png" alt=""></p>
<h3 id="object-array-자료형을-이용해서-배열-만들기">object, array 자료형을 이용해서 배열 만들기</h3>
<p><img src="https://images.velog.io/images/ji_o_ni/post/832fe895-09b4-400c-b7a6-8fceebb1513b/image.png" alt="">
두 개의 배열을 만들었고 만약 1번째 배열의 price를 가져오고 싶다면 아래와 같다.
<img src="https://images.velog.io/images/ji_o_ni/post/c9deb58e-49c7-41e9-a173-43d700ed3f3e/image.png" alt=""></p>
<hr>
<h2 id="연산자">연산자</h2>
<h3 id="기본-연산자">기본 연산자</h3>
<p><img src="https://images.velog.io/images/ji_o_ni/post/df99f9dd-9271-4234-b170-3e34ee77a6b2/image.png" alt=""></p>
<h3 id="비교-연산자">비교 연산자</h3>
<p><img src="https://images.velog.io/images/ji_o_ni/post/965f15d6-f03e-4d03-9b50-be9fd297f692/image.png" alt=""></p>
<h3 id="부정-연산자">부정 연산자</h3>
<p><img src="https://images.velog.io/images/ji_o_ni/post/1ee30cb3-165b-47d0-a284-52f792e10b01/image.png" alt=""></p>
<h3 id="논리-연산자">논리 연산자</h3>
<p><img src="https://images.velog.io/images/ji_o_ni/post/9cbf7dad-8195-4a36-bced-40e715da8b61/image.png" alt=""></p>
<hr>
<h2 id="조건문">조건문</h2>
<p><img src="https://images.velog.io/images/ji_o_ni/post/4b729ddb-2a37-47b6-907d-bd900a83a6da/image.png" alt=""></p>
<hr>
<h2 id="반복문">반복문</h2>
<p><img src="https://images.velog.io/images/ji_o_ni/post/9791e25a-0733-4051-9880-307a3147c51d/image.png" alt="">
<img src="https://images.velog.io/images/ji_o_ni/post/e3c5a905-1bc5-40f8-8410-327fcfaa7c7f/image.png" alt="">
<img src="https://images.velog.io/images/ji_o_ni/post/78721333-e8ed-447e-8ea7-dd11ce18d24d/image.png" alt=""></p>
<hr>
<h2 id="함수">함수</h2>
<h3 id="선언식과-표현식">선언식과 표현식</h3>
<p><img src="https://images.velog.io/images/ji_o_ni/post/73915a7a-36a2-4ae0-8b7d-a9f29f794ad9/image.png" alt="">
<img src="https://images.velog.io/images/ji_o_ni/post/12796b32-a5bd-4cf8-be54-346942c9f642/image.png" alt=""></p>
<h3 id="파라미터와-리턴">파라미터와 리턴</h3>
<p>파라미터란 함수의 () 내부에 입력하는 값을 의미한다. 함수의 파라미터를 활용하면 함수를 좀 더 확장성 있게 사용이 가능하고, 문자+숫자 형태로 활용할 수 있다.
<img src="https://images.velog.io/images/ji_o_ni/post/c4602908-2fc6-4c8c-99d2-8a9547340476/image.png" alt="">
리턴(return)으로 함수의 값을 반환할 수 있다. string, nubmer, 배열, 객체뿐 아니라 함수 또한 return이 가능하고, 함수에서 return 하게 되면 return 아래 있는 코드는 실행되지 않는다.
<img src="https://images.velog.io/images/ji_o_ni/post/94ba9f30-5f2f-44c2-9938-60e83acd458c/image.png" alt="">
또한 함수 안에 선언된 변수는 밖에서 사용이 불가하고, 함수 밖에서 선언된 변수는 함수 안에서 사용이 가능하다.
<img src="https://images.velog.io/images/ji_o_ni/post/982685df-6f40-4972-8df7-f5ebc0ee741d/image.png" alt=""></p>
<hr>
<h2 id="연습-문제">연습 문제</h2>
<h3 id="products-배열을-넣었을-때-가격이-50000원-이상인-product-객체를-담은-배열을-반환하는-함수-만들기">products 배열을 넣었을 때, 가격이 50000원 이상인 product 객체를 담은 배열을 반환하는 함수 만들기</h3>
<p><img src="https://images.velog.io/images/ji_o_ni/post/244289be-085c-4454-8219-0303e2b156b4/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>