<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dongwookim_dev.log</title>
        <link>https://velog.io/</link>
        <description>水滴石穿</description>
        <lastBuildDate>Sat, 31 Jul 2021 07:31:20 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dongwookim_dev.log</title>
            <url>https://images.velog.io/images/dongwookim_dev/profile/3323289a-0628-418e-ab4f-7d9d19288a62/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dongwookim_dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dongwookim_dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[프로그래머스 lv1. 짝수와 홀수]]></title>
            <link>https://velog.io/@dongwookim_dev/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-lv1.-%EC%A7%9D%EC%88%98%EC%99%80-%ED%99%80%EC%88%98</link>
            <guid>https://velog.io/@dongwookim_dev/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-lv1.-%EC%A7%9D%EC%88%98%EC%99%80-%ED%99%80%EC%88%98</guid>
            <pubDate>Sat, 31 Jul 2021 07:31:20 GMT</pubDate>
            <description><![CDATA[<h3 id="문제유형-구현">문제유형: 구현</h3>
<h3 id="사용언어-python3">사용언어: python3</h3>
<h3 id="나의-풀이">나의 풀이</h3>
<pre><code class="language-python3">def solution(num):
    answer = &#39;&#39;
    if num % 2 == 0:
        answer += &#39;Even&#39;
    else:
        answer += &#39;Odd&#39;
    return answer</code></pre>
<blockquote>
<p>풀이 및 포인트: +=, -= 사용 가능함,</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flask 이용한 간단한 todo-list 만들기]]></title>
            <link>https://velog.io/@dongwookim_dev/Flask-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EA%B0%84%EB%8B%A8%ED%95%9C-todo-list-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@dongwookim_dev/Flask-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EA%B0%84%EB%8B%A8%ED%95%9C-todo-list-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Sat, 31 Jul 2021 07:21:50 GMT</pubDate>
            <description><![CDATA[<h3 id="목표-입력창에-할-일-입력-후-버튼-누르면-db-추가-밑에-할-일-추가-할일에-붙은-버튼-누르면-db-삭제-할-일-삭제">목표: 입력창에 할 일 입력 후 버튼 누르면 DB 추가 밑에 할 일 추가, 할일에 붙은 버튼 누르면 DB 삭제, 할 일 삭제</h3>
<h3 id="만들면서-고민했던-부분--삭제">만들면서 고민했던 부분 : 삭제!</h3>
<p>다른 부분은 4주차에 했던 것을 응용하여 했으나, 삭제는 어떻게 내가 지우는 데이터가 DB에서도 정확하게 삭제되게 하지? 에 대해 고민을 많이 했다.</p>
<blockquote>
<p>시도1: 숫자를 1부터 차례대로 부여하면 되지 않을까?</p>
</blockquote>
<pre><code class="language-Javacript">// 전역변수 let id = 0;
function makeTodo() {
    id++;
    const todo_give = document.querySelector(&#39;.input-text&#39;).value;

    fetch(&#39;/todo/create&#39;, {
        method: &#39;POST&#39;,
        headers: {
            &#39;Content-Type&#39;: &#39;application/json&#39;,
        },
        body: JSON.stringify({
            content: todo_give,
            id: id
        }),
    })
        .then(response =&gt; response.json())
        .then(data =&gt; {
            alert(data[&#39;msg&#39;]);
            window.location.reload();
        })
}</code></pre>
<p>결과: 창이 새로고침 될 때마다 처음부터 다시 읽기 때문에 모든 id가 결국 1이 된다(실패)</p>
<blockquote>
<p>시도2: DB에 있는 objectid를 사용하면 되지 않을까?</p>
</blockquote>
<p>mongoDB는 각 요소 하나 하나가 id를 가지고 있다. 이를 이용해서 이 id 값을 사용할 수 있을까 싶어 구글링을 한 결과 bson 패키지를 이용하면 쓸 수 있겠다는 생각이 들어 패키지를 다운로드 헀다!</p>
<p><img src="https://images.velog.io/images/dongwookim_dev/post/6d10be5e-1003-402b-993a-d877f5193fe1/20160906_57ce99af14f13.jpg" alt=""></p>
<p>그러나 매개변수 오류라는 메세지와 함께 패키지를 받을 수 없었다...(실패)</p>
<blockquote>
<p>시도3: 내가 id를 만들자!</p>
</blockquote>
<pre><code class="language-javacript">function makeTodo() {
    const todo_give = document.querySelector(&#39;.input-text&#39;).value;
    const id_give = Math.random().toString(36).substr(2,11);

    fetch(&#39;/todo/create&#39;, {
        method: &#39;POST&#39;,
        headers: {
            &#39;Content-Type&#39;: &#39;application/json&#39;,
        },
        body: JSON.stringify({
            content: todo_give,
            id: id_give
        }),
    })
        .then(response =&gt; response.json())
        .then(data =&gt; {
            alert(data[&#39;msg&#39;]);
            window.location.reload();
        })
}</code></pre>
<p>여기에 있는 todo_give 변수에 무작위로 생성된 10자를 DB로 보내서 구분을 지었더니 성공했다!!</p>
<p>+)기능은 구현하였으나... 디자인을 어떻게 보기 좋게 하는지 잘 모르겠따
+)fetch 기능을 잘 활용하면 새로고침 없이 만드는 것 또한 가능할 텐데 아직 방법을 잘 모르겠다...ㅠㅠ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스파르타코딩 왕초보 시작반 5주차 내용]]></title>
            <link>https://velog.io/@dongwookim_dev/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%EC%BD%94%EB%94%A9-%EC%99%95%EC%B4%88%EB%B3%B4-%EC%8B%9C%EC%9E%91%EB%B0%98-5%EC%A3%BC%EC%B0%A8-%EB%82%B4%EC%9A%A9-with-jquery</link>
            <guid>https://velog.io/@dongwookim_dev/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%EC%BD%94%EB%94%A9-%EC%99%95%EC%B4%88%EB%B3%B4-%EC%8B%9C%EC%9E%91%EB%B0%98-5%EC%A3%BC%EC%B0%A8-%EB%82%B4%EC%9A%A9-with-jquery</guid>
            <pubDate>Sat, 31 Jul 2021 06:56:33 GMT</pubDate>
            <description><![CDATA[<h3 id="모두가-볼-수-있는-사이트-만들기">모두가 볼 수 있는 사이트 만들기!</h3>
<p>모두가 볼 수 있는 사이트는 어떻게 만들면 될까? 크게 두 가지 요건을 충족하면 될 것이다.</p>
<p>1) 접속할 사이트의 주소를 아는 것
2) 언제나 서버가 작동해야 할 것</p>
<p>1번을 만족하기 위해 사이트 주소인 도메인 구입을 하였고, 2번을 만족하기 위해 항상 가동하는 서버를 샀다. 이 두 과정에서 필요한 지식들은 다음과 같다.</p>
<blockquote>
<p>내가 산 서버는 운영체제가 ubuntu이기 때문에 Git bash를 통해 linux 명령어로 조작해 주어야 한다!</p>
</blockquote>
<p>ls: 내 위치의 모든 파일을 보여준다.</p>
<p>pwd: 내 위치(폴더의 경로)를 알려준다.</p>
<p>mkdir: 내 위치 아래에 폴더를 하나 만든다.</p>
<p>cd [갈 곳]: 나를 [갈 곳] 폴더로 이동시킨다.</p>
<p>cd .. : 나를 상위 폴더로 이동시킨다.</p>
<p>cp -r [복사할 것] [붙여넣기 할 것]: 복사 붙여넣기</p>
<p>rm -rf [지울 것]: 지우기</p>
<p>sudo [실행 할 명령어]: 명령어를 관리자 권한으로 실행한다.
sudo su: 관리가 권한으로 들어간다. (나올때는 exit으로 나옴)</p>
<blockquote>
<p>서버가 끊기지 않고 돌아가게 하려면 다음과 같은 명령어를 통해 설정할 수 있다.</p>
</blockquote>
<pre><code class="language-python"># 아래의 명령어로 실행하면 된다
nohup python app.py &amp;

# 아래 명령어로 미리 pid 값(프로세스 번호)을 본다
ps -ef | grep &#39;app.py&#39;

# 아래 명령어로 특정 프로세스를 죽인다
kill -9 [pid값]</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[스파르타코딩 왕초보 시작반 4주차 내용(4-1 ~ 4-16) with javascript]]></title>
            <link>https://velog.io/@dongwookim_dev/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%EC%BD%94%EB%94%A9-%EC%99%95%EC%B4%88%EB%B3%B4-%EC%8B%9C%EC%9E%91%EB%B0%98-4%EC%A3%BC%EC%B0%A8-%EB%82%B4%EC%9A%A94-1-4-16-with-javascript</link>
            <guid>https://velog.io/@dongwookim_dev/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%EC%BD%94%EB%94%A9-%EC%99%95%EC%B4%88%EB%B3%B4-%EC%8B%9C%EC%9E%91%EB%B0%98-4%EC%A3%BC%EC%B0%A8-%EB%82%B4%EC%9A%A94-1-4-16-with-javascript</guid>
            <pubDate>Thu, 29 Jul 2021 09:49:16 GMT</pubDate>
            <description><![CDATA[<h3 id="http-request를-javascript의-fetch로-해결">HTTP request를 javascript의 fetch로 해결!</h3>
<p>이전 글과 같은 내용을 하였으나, jquery의 ajax 기능 대신 javascript의 fetch기능을 사용해 보았고 어떤 부분이 어떤 역할을 하는지 바뀐 부분만 비교해 보고자 한다.</p>
<pre><code class="language-javascript">fetch(&#39;/order&#39;, {
                method: &#39;POST&#39;,
                headers: {
                    &#39;Content-Type&#39;: &#39;application/json&#39;,
                },
                body: JSON.stringify({
                    name_give: name,
                    count_give: count,
                    address_give: address,
                    phone_give: phone
                })
            })//여기서 백엔드로 정보 전달
                .then(response =&gt; response.json())//성공하면
                .then(data =&gt; {
                    alert(data[&#39;msg&#39;]);
                    window.location.reload();
                });
        }</code></pre>
<pre><code class="language-javascript">    $.ajax({
                type: &quot;POST&quot;,
                url: &quot;/order&quot;,
                data: {name_give: name, 
                       count_give: count, 
                       address_give: address, 
                       phone_give: phone},//여기서 백엔드로 정보전달
                success: function (response) { // 성공하면
                    alert(response[&quot;msg&quot;]);
                    window.location.reload();

                }</code></pre>
<p>데이터를 json 형태로 백엔드로 전달하면, then 과 success에서 결과를 받아 진행한다. 여기에서 전달받은 값(response)을 fetch에서는 json으로 한번 바꿔주는 과정을 거쳐야 하지만, jquery는 자동으로 해주는 것 같다. </p>
<p>fetch에서 JSON.stringify()는 오브젝트를 JSON화 시켜주는 메소드이다. jquery에서는 자동으로 해주는 것 같다. JSON은 통신 규격이기 때문에 바꿔준 것으로 보이며, JSON과 object의 차이는 앞의 key 값이 JSON에서는 따옴표 처리가 된다는 것이다.</p>
<pre><code class="language-python">    name_receive = request.json[&#39;name_give&#39;]
    count_receive = request.json[&#39;count_give&#39;]
    address_receive = request.json[&#39;address_give&#39;]
    phone_receive = request.json[&#39;phone_give&#39;]</code></pre>
<p>그리고 백엔드에서 POST한 정보를 읽어오는 과정에도 오류가 있었다. jquery는 request.form으로 읽어와도 문제가 없었지만, fetch로 읽을 땐 keyError가 나서 왜 그런지 찾아봤더니, request를 사용할 땐 정보가 json 형태로 주고 받기 때문에 request.json으로 찾아야 찾아진다는 것을 알 수 있었다.</p>
<p>느낀 점: javascript로만 풀면 &#39;알아서 해줄게&#39; 하는 부분이 적어지는 것은 맞는 것 같다. 그러나 해결하면서 원리를 더 잘 이해하게 된 것 같아 오히려 좋아</p>
<p>짤 출처: <a href="https://www.youtube.com/watch?v=MMSvdoXqiMs">https://www.youtube.com/watch?v=MMSvdoXqiMs</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스파르타코딩 왕초보 시작반 4주차 내용(4-1 ~ 4-16) with jQuery]]></title>
            <link>https://velog.io/@dongwookim_dev/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%EC%BD%94%EB%94%A9-%EC%99%95%EC%B4%88%EB%B3%B4-%EC%8B%9C%EC%9E%91%EB%B0%98-4%EC%A3%BC%EC%B0%A8-%EB%82%B4%EC%9A%A94-1-4-16</link>
            <guid>https://velog.io/@dongwookim_dev/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%EC%BD%94%EB%94%A9-%EC%99%95%EC%B4%88%EB%B3%B4-%EC%8B%9C%EC%9E%91%EB%B0%98-4%EC%A3%BC%EC%B0%A8-%EB%82%B4%EC%9A%A94-1-4-16</guid>
            <pubDate>Thu, 29 Jul 2021 05:21:17 GMT</pubDate>
            <description><![CDATA[<h3 id="flask-사용해보기-http-request-with-jquery">flask 사용해보기, HTTP request with jQuery</h3>
<p>목표 : 주문 버튼을 누르면 주문자 목록이 추가되는 기능 만들기</p>
<p>중요하다고 느낀 기술 : HTTP request</p>
<p>흐름 : </p>
<p>1) 클라이언트 측에서 주문서를 작성하여 주문하기 버튼을 누른다.
<img src="https://images.velog.io/images/dongwookim_dev/post/9770030b-3eea-4160-9890-fbcfc9549771/step1.PNG" alt=""></p>
<p>2) 버튼에 있던 onclick 함수가 작동한다. 이 함수는 POST 메서드로 백엔드 단에 object 형태의 데이터를 전송한다.</p>
<pre><code class="language-javascript">        function order() {
            const name = $(&#39;#order-name&#39;).val();
            let count = $(&#39;#order-count&#39;).val();
            let address = $(&#39;#order-address&#39;).val();
            let phone = $(&#39;#order-phone&#39;).val();
            // 주문하기 API 연결
              $.ajax({
                type: &quot;POST&quot;,
                url: &quot;/order&quot;,
                data: {name_give: name, count_give: count, address_give: address, phone_give: phone}, //여기서 백엔드로 전송!
                success: function (response) { // 성공하면
                    alert(response[&quot;msg&quot;]);
                    window.location.reload();

                }
            })
        }</code></pre>
<p>3) 백엔드 단에 있던 POST 메서드가 프론트 단에서 전송된 정보를 받아 작동한다. 백엔드에서는 object 형태의 데이터를 추출하여 새로운 오브젝트로 만들고, 이를 db에 저장한다.</p>
<pre><code class="language-python">@app.route(&#39;/order&#39;, methods=[&#39;POST&#39;])
def save_order():
    name_receive = request.form[&#39;name_give&#39;]
    count_receive = request.form[&#39;count_give&#39;]
    address_receive = request.form[&#39;address_give&#39;]
    phone_receive = request.form[&#39;phone_give&#39;]

    doc = {
        &#39;name&#39;: name_receive,
        &#39;count&#39;: count_receive,
        &#39;address&#39;: address_receive,
        &#39;phone&#39;: phone_receive
    }

    db.ordersjq.insert_one(doc)
    return jsonify({&#39;msg&#39;: &#39;주문 성공!&#39;}) #성공 메세지를 프론트로!</code></pre>
<p>4.5) 성공 메세지를 백엔드에서 받게되면 프론트엔드에서 success 파트를 실행한다.</p>
<pre><code class="language-javascript">        function order() {
            const name = $(&#39;#order-name&#39;).val();
            let count = $(&#39;#order-count&#39;).val();
            let address = $(&#39;#order-address&#39;).val();
            let phone = $(&#39;#order-phone&#39;).val();
            // 주문하기 API 연결
              $.ajax({
                type: &quot;POST&quot;,
                url: &quot;/order&quot;,
                data: {name_give: name, count_give: count, address_give: address, phone_give: phone}, 
                success: function (response) { // 성공하면
                    alert(response[&quot;msg&quot;]); //응답의 메세지 알림
                    window.location.reload(); //창 새로고침

                }
            })
        }</code></pre>
<p><img src="https://images.velog.io/images/dongwookim_dev/post/b46dbfd8-571d-4de6-8bf9-02bcb11cebf2/step2.PNG" alt=""></p>
<p>4) onclick 함수에 있던 새로고침 함수에 의해 페이지가 새로고침 되고, 프론트 단에 ready로 걸려있던 GET 함수가 작동한다. (사실 항상 작동되고 있었지만, 데이터 베이스에 자료가 있을 때 결과가 나타난다.)</p>
<pre><code class="language-javascript">        $(document).ready(function () {
            function order_listing() {
            // 주문목록 보기 API 연결

                        $.ajax({
                type: &quot;GET&quot;,
                url: &quot;/order&quot;,
                data: {}, //여기서 백엔드와 통신!
                success: function (response) {
                    if (response[&#39;result&#39;] == &#39;success&#39;) {
                        const orders = response[&#39;orders&#39;];
                        for (let i = 0; i &lt; orders.length; i++) {
                            const name = orders[i][&#39;name&#39;];
                            const count = orders[i][&#39;count&#39;];
                            const address = orders[i][&#39;address&#39;];
                            const phone = orders[i][&#39;phone&#39;];

                            const temp_html = `&lt;tr&gt;
                                                &lt;th scope=&quot;row&quot;&gt;${name}&lt;/th&gt;
                                                &lt;td&gt;${count}&lt;/td&gt;
                                                &lt;td&gt;${address}&lt;/td&gt;
                                                &lt;td&gt;${phone}&lt;/td&gt;
                                            &lt;/tr&gt;`

                            $(&#39;#orders-box&#39;).append(temp_html);
                        }
                    }
                }
            })
        }
        });</code></pre>
<p>5) 백엔드 단에 있던 GET 메서드가 작동한다. 데이터 베이스에 저장된 모든 주문자의 정보를 오브젝트 형태로 만들어서 json 형태로 리턴한다.</p>
<pre><code class="language-python">@app.route(&#39;/order&#39;, methods=[&#39;GET&#39;])
def view_orders():
    orders = list(db.ordersjq.find({}, {&#39;_id&#39;: False}))
    return jsonify({&#39;result&#39;: &#39;success&#39;, &#39;orders&#39;: orders}) #다시 프론트 success로 전송!</code></pre>
<p>6) 모든 주문자의 정보를 for 문을 돌면서 프론트에서 결과를 보여준다.
<img src="https://images.velog.io/images/dongwookim_dev/post/6bb1c344-0718-4ab8-b871-454f64cb9389/step3.PNG" alt=""></p>
<p>결론 : HTTP request를 통해 클라이언트와 서버는 정보를 주고 받는다.</p>
<p>중요한 것 : 주소와 method가 일치할 때 서로 필요한 정보를 주고 받는다.</p>
<p>+)flask는 왜 쓰는 것이며, 무슨 장점을 가지고 있는걸까?
+)bs4로는 패키지 다운안되고, BeautifulSoup4로 받으면 받아짐, 또 다른 패키지는 잘 받아짐 도대체 왜????</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스파르타코딩 왕초보 시작반 3주차 내용(3-4 ~ 3-15)]]></title>
            <link>https://velog.io/@dongwookim_dev/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%EC%BD%94%EB%94%A9-%EC%99%95%EC%B4%88%EB%B3%B4-%EC%8B%9C%EC%9E%91%EB%B0%98-3%EC%A3%BC%EC%B0%A8-%EB%82%B4%EC%9A%A93-4-3-15</link>
            <guid>https://velog.io/@dongwookim_dev/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%EC%BD%94%EB%94%A9-%EC%99%95%EC%B4%88%EB%B3%B4-%EC%8B%9C%EC%9E%91%EB%B0%98-3%EC%A3%BC%EC%B0%A8-%EB%82%B4%EC%9A%A93-4-3-15</guid>
            <pubDate>Sat, 24 Jul 2021 07:36:57 GMT</pubDate>
            <description><![CDATA[<h3 id="파이썬-기초와-패키지를-통한-웹-스크래핑-db-저장">파이썬 기초와 패키지를 통한 웹 스크래핑, DB 저장</h3>
<p>파이썬 기초문법</p>
<pre><code class="language-python">#변수 정의, 바로 = 으로 정의한다.
n = 1

#함수 정의, {}로 구분하지 않고 :과 들여쓰기로 범위 구분한다.
def sum(a, b):
    return a+b</code></pre>
<p>패키지를 이용하여 여러가지 기능을 편하게 사용할 수 있다.</p>
<p><img src="https://images.velog.io/images/dongwookim_dev/post/b7df2e4a-12ba-4af6-a8cb-08f4d2f15dc5/sqlnosql.png" alt=""></p>
<p>DB의 종류에는 sql과 nosql이 있으며, sql은 큰 표를 만들어 내용을 채우는 것이라면, nosql은 한 줄씩 새로운 정보를 추가해 나가는 방법이다. 시작반에서는 nosql을 사용할 예정이다.</p>
<pre><code class="language-python">import requests
from bs4 import BeautifulSoup

headers = {&#39;User-Agent&#39; : &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36&#39;}
data = requests.get(&#39;https://www.genie.co.kr/chart/top200?ditc=D&amp;ymd=20200403&amp;hh=23&amp;rtm=N&amp;pg=1&#39;,headers=headers)

soup = BeautifulSoup(data.text, &#39;html.parser&#39;)

trs = soup.select(&#39;#body-content &gt; div.newest-list &gt; div &gt; table &gt; tbody &gt; tr&#39;)

for tr in trs:
    title = tr.select_one(&#39;td.info &gt; a.title.ellipsis&#39;).text.strip()
    rank = tr.select_one(&#39;td.number&#39;).text[0:2]
    artist = tr.select_one(&#39;td.info &gt; a.artist.ellipsis&#39;).text
    print(rank, title, artist)</code></pre>
<p>request, beautifulsoup 이라는 패키지를 통해서
웹페이지의 특정 부분을 지정하여, 파이선 문법으로 반복하여 긁어오는 작업을 할 수 있었다. 이를 웹 스크래핑이라 부르고, 결과는 DB에 저장 할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스파르타코딩 왕초보 시작반 2주차 내용(2-7 ~ 3-3)]]></title>
            <link>https://velog.io/@dongwookim_dev/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%EC%BD%94%EB%94%A9-%EC%99%95%EC%B4%88%EB%B3%B4-%EC%8B%9C%EC%9E%91%EB%B0%98-2%EC%A3%BC%EC%B0%A8-%EB%82%B4%EC%9A%A92-7-3-3</link>
            <guid>https://velog.io/@dongwookim_dev/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%EC%BD%94%EB%94%A9-%EC%99%95%EC%B4%88%EB%B3%B4-%EC%8B%9C%EC%9E%91%EB%B0%98-2%EC%A3%BC%EC%B0%A8-%EB%82%B4%EC%9A%A92-7-3-3</guid>
            <pubDate>Sat, 24 Jul 2021 06:28:22 GMT</pubDate>
            <description><![CDATA[<h3 id="api-정보요청-및-받아오기">API 정보요청 및 받아오기</h3>
<p><img src="https://images.velog.io/images/dongwookim_dev/post/1392aee5-e71e-4016-8436-38a87192f1c7/090720_0532_WhatisanAPI1.png" alt=""></p>
<blockquote>
<p>API란? : API(Application Programming Interface 애플리케이션 프로그래밍 인터페이스, 응용 프로그램 프로그래밍 인터페이스)는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. 주로 파일 제어, 창 제어, 화상 처리, 문자 제어 등을 위한 인터페이스를 제공한다.
출처: <a href="https://ko.wikipedia.org/wiki/API">https://ko.wikipedia.org/wiki/API</a></p>
</blockquote>
<p>이를 이용하여 정보를 가공해 사용자가 볼 수 있게 하는 작업을 했다.</p>
<p><img src="https://images.velog.io/images/dongwookim_dev/post/b56fb1f2-6c34-41d7-874a-a21d820ffd77/json.PNG" alt="">
이것이 백엔드에서 제공해주는 정보이다.</p>
<pre><code class="language-Javascript">fetch(&quot;http://spartacodingclub.shop/post&quot;)
    .then(result =&gt; result.json())
    .then(apiData =&gt; {
        const articles = apiData[&#39;articles&#39;];
        for (let i = 0; i &lt; articles.length; i++) {
            let cardList = document.querySelector(&#39;.card-list&#39;);
            const comment = articles[i][&#39;comment&#39;];
            const desc = articles[i][&#39;desc&#39;];
            const image = articles[i][&#39;image&#39;];
            const title = articles[i][&#39;title&#39;];
            const url = articles[i][&#39;url&#39;];

            let temp = `&lt;li class=&quot;card-item&quot;&gt;
                            &lt;figure class=&quot;card-image&quot; style=&quot;background-image: url(${image});&quot;&gt;
                                &lt;img src=&quot;${image}&quot; alt=&quot;배경화면&quot;&gt;
                            &lt;/figure&gt;
                            &lt;div class=&quot;card-desc&quot;&gt;
                                &lt;a href=&quot;${url}&quot;&gt;${title}&lt;/a&gt;
                                &lt;p class=&quot;card-text&quot;&gt;
                                    ${desc}
                                &lt;/p&gt;
                                &lt;p class=&quot;card-text-comment&quot;&gt;
                                    ${comment}
                                &lt;/p&gt;
                            &lt;/div&gt;
                        &lt;/li&gt;`;
            cardList.innerHTML+=temp;
        }
    });</code></pre>
<p>fetch, then, DOM을 이용하여 정보를 받고(fetch), 다 받았을 때(then) HTML을 조작하여 꾸민다(DOM)</p>
<p><img src="https://images.velog.io/images/dongwookim_dev/post/1737b02f-3ab8-4107-8049-5652895a3e01/result.PNG" alt=""></p>
<p>그렇게 해서 사용자가 보기 좋은 결과물을 낸다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스파르타코딩 왕초보 시작반 2주차 내용(2-1 ~ 2-6)]]></title>
            <link>https://velog.io/@dongwookim_dev/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%EC%BD%94%EB%94%A9-%EC%99%95%EC%B4%88%EB%B3%B4-%EC%8B%9C%EC%9E%91%EB%B0%98-2%EC%A3%BC%EC%B0%A8-%EB%82%B4%EC%9A%A92-1-2-6</link>
            <guid>https://velog.io/@dongwookim_dev/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%EC%BD%94%EB%94%A9-%EC%99%95%EC%B4%88%EB%B3%B4-%EC%8B%9C%EC%9E%91%EB%B0%98-2%EC%A3%BC%EC%B0%A8-%EB%82%B4%EC%9A%A92-1-2-6</guid>
            <pubDate>Sat, 24 Jul 2021 03:46:35 GMT</pubDate>
            <description><![CDATA[<h3 id="dom이란-무엇인가">DOM이란 무엇인가??</h3>
<p><img src="https://images.velog.io/images/dongwookim_dev/post/7974ff22-1841-433e-84f3-5d1480cc9ae3/%EB%8F%941.jpg" alt="">
<img src="https://images.velog.io/images/dongwookim_dev/post/54bfb96a-ad73-43b1-8456-c6066b1dc874/%EB%8F%942.jpg" alt=""></p>
<p>이 아니라 Document Object Model의 약자로서 HTML 문서를 계층화하고 접근할 수 있도록 돕는 인터페이스 이다.</p>
<p>이번 시간에는 자바스크립트를 이용하여 DOM을 사용, 웹사이트에 변화를 주는 연습을 하였다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스파르타코딩 왕초보 시작반 1주차 내용(1-12 ~ 1-16)]]></title>
            <link>https://velog.io/@dongwookim_dev/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%EC%BD%94%EB%94%A9-%EC%99%95%EC%B4%88%EB%B3%B4-%EC%8B%9C%EC%9E%91%EB%B0%98-1%EC%A3%BC%EC%B0%A8-%EB%82%B4%EC%9A%A91-12-1-16</link>
            <guid>https://velog.io/@dongwookim_dev/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%EC%BD%94%EB%94%A9-%EC%99%95%EC%B4%88%EB%B3%B4-%EC%8B%9C%EC%9E%91%EB%B0%98-1%EC%A3%BC%EC%B0%A8-%EB%82%B4%EC%9A%A91-12-1-16</guid>
            <pubDate>Sat, 24 Jul 2021 03:01:26 GMT</pubDate>
            <description><![CDATA[<h3 id="flex-grow의-힘에-대해-배움">Flex grow의 힘에 대해 배움!</h3>
<p><img src="https://images.velog.io/images/dongwookim_dev/post/6f72fbb3-8dd6-4877-89e1-3a901e095d42/%EB%B6%88%ED%8E%B8.PNG" alt="">
<img src="https://images.velog.io/images/dongwookim_dev/post/f1a2115a-b9fd-43a4-a856-d46d8316ce7c/unnamed%20(1).jpg" alt=""></p>
<pre><code class="language-css">
.input {
    height: auto;
    line-height: normal;
    padding: .8em .5em;
    font-family: inherit;
    border: 1px solid #999;
    border-radius: 0;
    outline-style: none;
}</code></pre>
<p><img src="https://images.velog.io/images/dongwookim_dev/post/9a8187c9-e7b4-462a-a92a-509538d5ace0/%ED%8E%B8%EC%95%88.PNG" alt="">
<img src="https://images.velog.io/images/dongwookim_dev/post/c119d5a1-2a98-498e-a175-d98b2e97c1aa/unnamed.jpg" alt=""></p>
<pre><code class="language-css">.control {
    display: flex;
}

.input {
    flex: 1;
    height: auto;
    line-height: normal;
    padding: .8em .5em;
    font-family: inherit;
    border: 1px solid #999;
    border-radius: 0;
    outline-style: none;
}</code></pre>
<p>제목과 입력창을 감싸는 .control에 display를 flex로 주고, input의 길이를 끝까지 늘일 수 있는 flex를 1로 주면 자동적으로 끝까지 늘어난다! 편-안</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[드림코딩 자바스크립트 기초강의 정리13]]></title>
            <link>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC13</link>
            <guid>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC13</guid>
            <pubDate>Tue, 20 Jul 2021 13:59:36 GMT</pubDate>
            <description><![CDATA[<h3 id="비동기의-꽃-javascript-async와-await-그리고-유용한-promise-apis">비동기의 꽃 JavaScript async와 await 그리고 유용한 Promise APIs</h3>
<blockquote>
<p>promise가 많아지면 또 난잡해지기 때문에 깔끔하게 만들 수 있는 방식인 async와 await을 알아보자! </p>
</blockquote>
<pre><code class="language-Javascript">//async &amp; await
//clear style of using promise ;)

//1.async
async function fetchUser() {
     //do network request in 10secs...
      return &#39;ellie&#39;;
}

const user = fetchUser();
user.then(console.log);
console.log(user);
//함수 앞에 async를 붙혀주면 Promise를 쓴 것과 같은 상태가 된다. 다음은 그대로 결과에 then이나 catch, finally 사용

//2. await
function delay(ms) {
    return new Promise(resolve =&gt; setTimeout(resolve, ms));
}

async function getApple() {
    await delay(3000);
      return &#39;apple&#39;;
}

async function getBanana() {
    await delay(3000);
      return &#39;banana&#39;;
}
//await은 Promise가 실행될 때 까지 기다려주는 것을 나타낸다.

async function pickFruits() {
    const apple = await getApple();
      const banana = await getBanana();
      return `${apple} + ${banana}`
}

//3. useful promise APIs
//Promise.all: 여러가지 함수가 병렬적으로 처리된다.
//Promise.race: 전달값 중 가장 빠른 결과 return</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[드림코딩 자바스크립트 기초강의 정리12]]></title>
            <link>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC12</link>
            <guid>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC12</guid>
            <pubDate>Tue, 20 Jul 2021 13:31:20 GMT</pubDate>
            <description><![CDATA[<h3 id="프로미스-개념부터-활용까지">프로미스 개념부터 활용까지</h3>
<blockquote>
<p>원하는 순서대로 결과를 이끌어내기 위해 고안된 콜백함수! 그러나 복잡한 기능을 구현하기 시작하면 콜백함수가 꼬리를 무는 콜백지옥이 발생한다. 이를 해결하기 위한 promise는 어떤 기능인지 알아보도록 하자!</p>
</blockquote>
<p>Promise : javascript가 제공하는 콜백함수 대신 간편하게 쓸 수 있는 오브젝트. 성공, 실패에 따른 결과를 알려준다.</p>
<pre><code class="language-Javascript">//Promise is a JavaScript object for asynchronous operation.
//1. State: 진행되었는지 또는 끝났는지? pending =&gt; fulfilled or rejected
//2. Producer vs Consumer

//1.Producer
//when new promise is created, the executer runs automatically.
const promise = new Promise((resolve, reject) =&gt; {
    //doing some heavy work (network, read files)
  console.log(&#39;doing something...&#39;);
  setTimeout(() =&gt; {
      resolve(&#39;ellie&#39;);
    //reject(new Error(&#39;no network&#39;))
  }, 2000);
});

//2. Consumers: then, catch, finally
//then: constructor가 완료된 &#39;다음&#39;진행 할 수 있게 해주는 메소드, promise 값이나 또 다른 promise를 받는다.
//catch: 에러가 났을 때 다음 진행을 위한 메소드
//finally: 성공, 실패 여부에 상관없이 마지막에 출력됨.
promise
     .then((value) =&gt; {
        console.log(value);
    })
    .catch((value) =&gt; {
        console.log(error);
    })
    .finally(() =&gt; {
        console.log(&#39;finally&#39;);
    });

//3.Promise chaining
const fetchNumber = new Promise((resolve, reject) =&gt; {
    setTimeout(() =&gt; resolve(1), 1000);
});

fetchNumber
.then(num =&gt; num * 2)
.then(num =&gt; num * 3)
.then(num =&gt; {
    return new Promise((resolve, reject) =&gt; {
        setTimeout(() =&gt; resolve(num - 1), 1000);
    });
})
.then(num =&gt; console.log(num));

//4. Error Handling
const getHen = () =&gt;
    new Promise((resolve, reject) =&gt; {
        setTimeout(() =&gt; resolve(&#39;🐓&#39;), 1000);
    });
const getEgg = hen =&gt;
    new Promise((resolve, reject) =&gt; {
        setTimeout(() =&gt; resolve(`${hen} =&gt; 🥚`), 1000);
    });
const cook = egg =&gt; 
    new Promise((resolve, reject) =&gt; {
        setTimeout(() =&gt; resolve(`${egg} =&gt; 🍳`), 1000);
    });

getHen()
    .then(hen =&gt; getEgg(hen)) //value를 그대로 전해주는 것이라면 .then(getEgg) 로 표현 가능!
    .then(egg =&gt; cook(egg))
    .then(meal =&gt; console.log(meal))
    .catch(console.log(meal));
//catch의 순서를 바꾸면서 에러 시 결과를 바꿀 수 있다.

//Callback Hell =&gt; promise
class UserStorage {
    loginUser(id, password) {
      return new Promise((resolve, reject) =&gt; {
          setTimeout(() =&gt; {
            if (
                  (id === &#39;ellie&#39; &amp;&amp; password === &#39;dream&#39;) ||                 (id === &#39;coder&#39; &amp;&amp; password === &#39;academy&#39;)
               ) {
                resolve(id);
            } else {
                reject(new Error(&#39;not found&#39;));
            }
        }, 2000);
      });

    }

      getRoles(user) {
      return new Promise =&gt; ((resolve, reject) =&gt; {
           setTimeout(() =&gt; {
            if (user === &#39;ellie&#39;) {
                resolve({ name: &#39;ellie&#39;, role: &#39;admin&#39; });
            } else {
                reject(new Error(&#39;no access&#39;));
            }
        }, 1000);
      });

    }

      const userStorage = new UserStorage();
    const id = prompt(&#39;enter your id&#39;);
    const password = prompt(&#39;enter your password&#39;);
    userStorage
         .loginUser(id, password)
        .then(userStorage.getRoles)
        .then(user =&gt; alert(`Hello ${userWithRole.name}, you have a ${userWirhRole} role`))
        .catch(console.log)

//확실히 더 깔끔해졌다!</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[드림코딩 자바스크립트 기초강의 정리11
]]></title>
            <link>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC11</link>
            <guid>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC11</guid>
            <pubDate>Tue, 20 Jul 2021 11:16:13 GMT</pubDate>
            <description><![CDATA[<h3 id="비동기-처리의-시작-콜백-이해하기-콜백-지옥-체험😱">비동기 처리의 시작 콜백 이해하기, 콜백 지옥 체험😱</h3>
<pre><code class="language-Javascript">//JavaScript is synchronous.
//Execute the code block in order after hoisting.
//hoisting: var, function declaration

console.log(&#39;1&#39;);
setTimeout(function() {
    console.log(&#39;2&#39;);
}, 1000);
console.log(&#39;3&#39;); // 132순서대로 보인다. setTimeout()은 asynchronous한 실행방법, 콜백함수: call(불러줘)back(나중에)

//synchronous callback 콜백의 동기적 실행
function printImmediately(print) {
    print();
}
printImmediately(() =&gt; console.log(&#39;hello&#39;))
//출력
//1, 3, hello, 2
//hoisting에 의해 함수 선언 제일 위로 이동, 차례대로 내려오면서 실행, setTimeout()에 의해 마지막으로 2 출력

//asynchronous callback 콜백의 비동기적 실행
function printWithDelay(print, timeout) {
    setTimeout(print, timeout);
}
printWithDelay(() =&gt; console.log(&#39;async callback&#39;), 2000);
//출력
//1, 3, hello, 2, async callback

//Callback Hell example
class UserStorage {
    loginUser(id, password, onSuccess, onError) {
        setTimeout(() =&gt; {
            if (
                  (id === &#39;ellie&#39; &amp;&amp; password === &#39;dream&#39;) ||                 (id === &#39;coder&#39; &amp;&amp; password === &#39;academy&#39;)
               ) {
                onSuccess(id);
            } else {
                onError(new Error(&#39;not found&#39;));
            }
        }, 2000);
    }

      getRoles(user, onSuccess, onError) {
        setTimeout(() =&gt; {
            if (user === &#39;ellie&#39;) {
                onSuccess({ name: &#39;ellie&#39;, role: &#39;admin&#39; });
            } else {
                onError(new Error(&#39;no access&#39;));
            }
        }, 1000);
    }

      const userStorage = new UserStorage();
    const id = prompt(&#39;enter your id&#39;);
    const password = prompt(&#39;enter your password&#39;);
    userStorage.loginUser(id, password, (user) =&gt; {
        id,
        password,
        user =&gt; {
            userStorage.getRoles(user, (userWithRole) =&gt; {
                alert(`Hello ${userWithRole.name}, you have a ${userWirhRole} role`)
            }, 
            error =&gt; {
                console.log(error)
            });
        },
        error =&gt; {console.log(error)},
    });
}
// 실행은 되지만 콜백지옥이 완성되었다...
//가독성 떨어짐, 로직 이해 떨어짐, 유지보수 어려움 등의 단점이 있다.</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[드림코딩 자바스크립트 기초강의 정리10]]></title>
            <link>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC10</link>
            <guid>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC10</guid>
            <pubDate>Tue, 20 Jul 2021 10:00:42 GMT</pubDate>
            <description><![CDATA[<h3 id="json-개념-정리와-활용방법-및-유용한-사이트-공유">JSON 개념 정리와 활용방법 및 유용한 사이트 공유</h3>
<blockquote>
<p>JSON이란? : JavaScript Object Notation의 약자로, 자바스크립트의 오브젝트(key, value)을 이용한 체계이다. 주로 데이터 전송 시 사용하며, 언어와 상관없이 사용 가능하다!</p>
</blockquote>
<pre><code class="language-Javascript">//JSON
//JavaScript Object Notation

//1. Object to JSON
//stringify(obj)
let json = JSON.stringify(true);
console.log(json); //true

json = JSON.stringify([&#39;apple&#39;, &#39;banana&#39;]);
console.log(json); //[&quot;apple&quot;, &quot;banana&quot;] 쌍따옴표로 표기(공식)

const rabbit = {
    name: &#39;tori&#39;,
      color: &#39;white&#39;,
      size: null,
      birthDate: new Date(),
      jump: () =&gt; {
        console.log(`${name} can jump!`);
    },
}

json = JSON.stringify(rabbit);
console.log(json); //{&quot;name&quot;: &quot;tori&quot;, &quot;color&quot;: &quot;white&quot;, &quot;size&quot;: json.null, &quot;birthDate&quot;: &quot;2021-07-20...&quot;,}

json = JSON.stringify(rabbit, [&#39;name&#39;, &#39;color&#39;, &#39;size&#39;]);
console.log(json); //{&quot;name&quot;: &quot;tori&quot;, &quot;color&quot;: &quot;white&quot;, &quot;size&quot;: json.null}

json = JSON.stringify(rabbit, (key, value) =&gt; {
    console.log(`key: ${key}, value: ${value}`);
      return value
});
console.log(json);// 세밀하게 통제하고 싶을 때 사용

//2. JSON to Object
//parse(json)
json = JSON.stringify(rabbit);
const obj = JSON.parse(json, (key, value) =&gt; {
    return key === &#39;birthDate&#39; ? new Date(value) : value;
});// 콜백함수 reviver을 통하여 세밀하게 구할 수 있다.
console.log(obj); //{name: &#39;tori&#39;,color: &#39;white&#39;,size: null,birthDate: &quot;2021-07-20...&quot;}
obj.jump(); //Error!(메소드 포함 x)

console.log(rabbit.birthDate.getDate());
console.log(obj.birthDate.getDate());
//데이터간 비교 : JSON diff, 
//JSON 정리: JSON beautifier,
//JSON =&gt; object: JSON Parser,
//JSON 유효성 검사: JSON Validator</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[드림코딩 자바스크립트 기초강의 정리9]]></title>
            <link>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC8-b559tuwr</link>
            <guid>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC8-b559tuwr</guid>
            <pubDate>Fri, 16 Jul 2021 13:48:58 GMT</pubDate>
            <description><![CDATA[<h3 id="유용한-10가지-배열-함수들">유용한 10가지 배열 함수들</h3>
<pre><code class="language-javascript">//퀴즈
// Q1. make a string out of an array
{
  const fruits = [&#39;apple&#39;, &#39;banana&#39;, &#39;orange&#39;];
}
let str=&#39;&#39;;
for (let i=0; i&lt;fruits.length; i++) {
    str.push(fruits[i]);
}
//정답
fruits.join();

// Q2. make an array out of a string
{
  const fruits = &#39;🍎, 🥝, 🍌, 🍒&#39;;
}
let arr = [];
for (let i = 0; i &lt; fruits.length; i++) {
    arr.push(fruits[i]);
}

//정답
fruits.split(&#39;,&#39;);

// Q3. make this array look like this: [5, 4, 3, 2, 1]
{
  const array = [1, 2, 3, 4, 5];
}
//1
array.reverse();
//2
let arr = []
for (let i = array.length-1; i &gt; 0; i--) {
    arr.push(array[i]);
}
array.reverse();

//풀이 : reverse는 원래 배열도 바꾼다.


// Q4. make new array without the first two elements
{
  const array = [1, 2, 3, 4, 5];
}

array.shift()
array.shift()

//정답X
const result = array.splice(0, 2);
console.log(result); // [1,2]
console.log(array); // [3, 4, 5]

//정답O
const result = array.slice(2, 5);
console.log(result); // [3, 4, 5];
console.log(array); //[1, 2, 3, 4, 5]

//----------------------------

class Student {
  constructor(name, age, enrolled, score) {
    this.name = name;
    this.age = age;
    this.enrolled = enrolled;
    this.score = score;
  }
}
const students = [
  new Student(&#39;A&#39;, 29, true, 45),
  new Student(&#39;B&#39;, 28, false, 80),
  new Student(&#39;C&#39;, 30, true, 90),
  new Student(&#39;D&#39;, 40, false, 66),
  new Student(&#39;E&#39;, 18, true, 88),
];

// Q5. find a student with the score 90
{
  for (let student of students) {
   if (Student[score] === 90) return Student;
  }

  //정답
  const result = students.find((student) =&gt; return student.score === 90);
}

// Q6. make an array of enrolled students
{
  let arr = []
   for (let student of students) {
   if (Student[enrolled] === true) arr.push(Student);
  }

  //정답
  const result = students.filter((student) =&gt; return student.enrolled);
}

// Q7. make an array containing only the students&#39; scores
// result should be: [45, 80, 90, 66, 88]
{
   let arr = []
   for (let student of students) {
       arr.push(Student[score]);
  }

  //정답
  students.map((student) =&gt; student.score)
}

// Q8. check if there is a student with the score lower than 50
{
   for (let student of students) {
       if (Student[score] &lt; 50) return true;
    else return false;
  }

  //정답: 조건이 맞는 몇 개의 결과 
  const result = students.some((student) =&gt; student.score &lt; 50);

  //every 조건에 맞는 모든 결과
}

// Q9. compute students&#39; average score
{
   let arr = []
   for (let student of students) {
       arr.push(Student[score]);
  }
 const sum = arr.reduce((a, b) =&gt; a + b, 0);
 const average = sum / arr.length;

  //정답
  const result = students.reduce((prev, curr) =&gt; prev + curr.score, 0);
   console.log(result / students.length);
}

// Q10. make a string containing all the scores
// result should be: &#39;45, 80, 90, 66, 88&#39;
{
   let str = &#39;&#39;;
   for (let student of students) {
       arr.push(Student[score]);
  }

    //정답
  const result = students
      .map((student) =&gt; student.score)
      .filter((score) =&gt; score &gt;= 50)
      .join();

  console.log(result);
}

// Bonus! do Q10 sorted in ascending order
// result should be: &#39;45, 66, 80, 88, 90&#39;
{
   let arr = []
   for (let student of students) {
       arr.push(Student[score]);
  }
  arr.sort((a, b) =&gt; a - b);

  //정답
    const result = students.map((student) =&gt; student.score)
    .sort((a, b) =&gt; a - b)
    .join()
    console.log(result);
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[드림코딩 자바스크립트 기초강의 정리8]]></title>
            <link>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC8</link>
            <guid>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC8</guid>
            <pubDate>Fri, 16 Jul 2021 13:16:10 GMT</pubDate>
            <description><![CDATA[<h3 id="배열-제대로-알고-쓰자-자바스크립트-배열-개념과-apis-총정리">배열 제대로 알고 쓰자. 자바스크립트 배열 개념과 APIs 총정리</h3>
<p>자료구조 : 데이터들을 담은 바구니 범위) 자료구조&gt;오브젝트</p>
<pre><code class="language-javascript">&#39;use strict&#39;;

//Array
//1.Declaration
const arr1 = new Array();
const arr2 = [1, 2];

//2. Index position
const fruits = [&#39;🍎&#39;, &#39;🍌&#39;];
console.log(fruits);//[&#39;🍎&#39;, &#39;🍌&#39;]
console.log(fruits.length);//2
console.log(fruits[0]);//&#39;🍎&#39;
console.log(fruits[1]);//&#39;🍌&#39;
console.log(fruits[2]);//undefined
console.log(fruits.length-1);

//3. Looping over an array
//print all fruits
//a. for
for (let i = 0; i &lt; fruits.length; i++) {
    console.log(fruits[i]);
}
//b. for of
for (let fruit of fruits) {
    console.log(fruit);
}
//c. forEach
fruits.forEach((fruit) =&gt; console.log(fruit));

//4. Addition, deletion, copy
//push: add an item to the end
//pop: remove an item from the end
//unshift: add an item to the beginning
//shift: remove an item from the beginning
//note!! shift, unshift are slower than push, pop! 앞에서 조작하려면 배열 요소를 많이 움직여야 하기 때문

//splice(시작점, 끝점, 추가데이터1, 추가데이터2...)
//arr1.concat(arr2)
//arr.includes(element) element가 포함됐는지 true, false로 알려줌
//arr.indexOf(element)
//arr.lastIndexOf(element)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[드림코딩 자바스크립트 기초강의 정리7]]></title>
            <link>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC7</link>
            <guid>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC7</guid>
            <pubDate>Fri, 16 Jul 2021 11:15:24 GMT</pubDate>
            <description><![CDATA[<h3 id="오브젝트-넌-뭐니">오브젝트 넌 뭐니?</h3>
<pre><code class="language-javascript">//Objects
//one of the JavaScript&#39;s data types.
//a collection of related data and/or functionality.
//Neary all objects in JavaScript are instance of Object
//Object = { key : value };

//--------------------------------------

//1. Literals ans properties

const obj1 = {}; //&#39;objective literal&#39; syntax
const obj2 = new Object(); //&#39;object constructor&#39; syntax

function print(person) {
    console.log(person.name);
     console.log(person.age);
}

const ellie = { name: &#39;ellie&#39;, age: 4};
print(ellie);

//with JavaScript magic (dynamically typed language)
//can add properties later
ellie.hasJob = true;
console.log(ellie.hasJob);//나중에 키 추가 가능

//can deleter properties later
delete ellie.hasJob;
console.log(ellie.hasJob);

//--------------------------------------

//2. computed properties: 계산된 properties -&gt; ellie[&#39;name&#39;]
//key should be always string
console.log(ellie.name); //key에 해당하는 값을 정확히 알 때
console.log(ellie[&#39;name&#39;]); //어떤 key가 필요한지 모를 때 = runtime에서 결정될 때
ellie[&#39;hasJob&#39;] = true;
console.log(ellie.hasJob);

//computed properties의 예, 동적으로 키 값 받을 때 유용하게 쓰인다. 보통은 .으로 접근
function printValue(obj, key) {
    console.log(obj[key]);
}
printValue(ellie, &#39;name&#39;);
printValue(ellie, &#39;age&#39;);

//--------------------------------------

//3. Property value shorthand: property와 value의 이름이 같다면 생략가능
const person1 = {name: &#39;bob&#39;, age: 2};
const person2 = {name: &#39;steve&#39;, age: 3};
const person3 = {name: &#39;dave&#39;, age: 4};
function makePerson(name, age) {
    return {
        name,
          age,
    }
}
const person4 = makePerson(&#39;ellie&#39;, 30);
console.log(person4) // {name: &#39;ellie&#39;, age: 30}

//--------------------------------------

// 4. Constructor function
function Person(name, age) {\
    //this = {};
      this.name = name;
      this.age = age;
      //return this;
}

const person5 = new Person(&#39;kim&#39;, 27);
console.log(person5); //Person {name: &#39;kim&#39;, age: 27};

//--------------------------------------

//5. in operator: property existence check (key in obj)
console.log(&#39;name&#39; in ellie); //true
console.log(&#39;age&#39; in ellie); //true
console.log(&#39;random&#39; in ellie); //false
console.log(ellie.random); //없으므로 undefined

//--------------------------------------

//6. for...in vs for...of
//for (key in obj)
for (key in kim) {
    console.log(key);
}                            

//for (value of iterable)
const array = [1, 2, 3, 4, 5];
for (value of array) {
    console.log(value);
}

//--------------------------------------                            
//Fun cloning
//Object.assign(dest, [obj1, obj2, obj3...])
const user = {name: &#39;ellie&#39;, age: &#39;20&#39;};
const user2 = user;
user2.name = &#39;coder&#39;;
console.log(user);

//old way
const user3 = {};
for (key in user) {
    user3[key] = user[key];
}
console.log(user3); //{name: &#39;coder&#39;, age: &#39;20&#39;}  


//new way
Object.assign(); //https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/assign        </code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[드림코딩 자바스크립트 기초강의 정리6]]></title>
            <link>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC6</link>
            <guid>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC6</guid>
            <pubDate>Fri, 16 Jul 2021 08:04:37 GMT</pubDate>
            <description><![CDATA[<h3 id="클래스와-오브젝트의-차이점class-vs-object-객체지향-언어-클래스-정리">클래스와 오브젝트의 차이점(class vs object) 객체지향 언어 클래스 정리</h3>
<p>0:51 클래스(class): 연관있는 속성들을 묶어놓은 것 field와 method가 있다.</p>
<pre><code class="language-javascript">class person{
    name; //fields 속성
    age; //fields 속성
    speak; //method 행동
}</code></pre>
<p>3:08 클래스: 붕어빵 틀, 청사진(template, declare once, no data in)
     오브젝트: 붕어빵(instance of a class, created many times, data in)</p>
<p>4:30 클래스 선언: </p>
<pre><code class="language-javascript">&#39;use strict&#39;;
//Object-oriented programming
//class: template
//Javascript classes
//    -introduced in ES6
//    -syntatical sugar over prototype-based inheritance

//1. Calss declarations
class Person {
    //constructor
  constructor(name, age) {
          //fields
    this.name = name;
    this.age = age;
  } 
    //methods
  speak() {
      console.log(`${this.name}: hello!`);
  }
}

//Object 생성
const ellie = new Person(&#39;ellie&#39;, 20);
console.log(ellie.name); //ellie
console.log(ellie.age); //20
ellie.speak(); //ellie: hello!</code></pre>
<p>8:28 Getter&amp;Setter:</p>
<pre><code class="language-javascript">class User {
    constructor(firstName, lastName, age) {
        this.firstName = firstName;
        this.lastName = lastName;
          this.age = age;
    }

      get age() {
        return this._age; //callstack exceed 방지
    }

      set age(value) {
          //if (value &lt; 0) {
         //throw Error(&#39;age can not be negative&#39;);
        //}
        this._age = value &lt; 0 ? 0 : value;
    }
 }

const user1 = new User(&#39;Steve&#39;, &#39;Jobs&#39;, -1);
console.log(user1.age); //-1 -&gt; Wrong!</code></pre>
<p>사용자가 잘못된 값을 넣지 못하게 하는 것</p>
<p>14:31 public&amp;private fields : 생성자(constructor)를 쓰지 않고 fields 사용가능</p>
<p>15:00 static: field값을 construct에 할당하지 않고 클래스에 할당할 수 있게 한다. 호출 시 할당변수명.필드 가 아닌 클래스.필드 로 호출한다.</p>
<p>18:00 extends: 클래스 상속가능, 필요한 메소드 재정의 가능(overriding), 메소드 재활용+변경은 super.메소드 사용</p>
<p>22:00 instanceof 상속 된지 아닌지 확인가능</p>
<p>23:56 mdn reference</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[드림코딩 자바스크립트 기초강의 정리5]]></title>
            <link>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC5</link>
            <guid>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC5</guid>
            <pubDate>Fri, 16 Jul 2021 03:46:50 GMT</pubDate>
            <description><![CDATA[<h3 id="arrow-function은-무엇인가-함수의-선언과-표현">Arrow Function은 무엇인가? 함수의 선언과 표현</h3>
<ol>
<li><p>함수는 object이다 → 변수로 함수 사용가능, 변수에 할당가능 등 여러가지 일이 가능하게 함</p>
<p> 10:10 default parameters 기본 매개변수값 지정</p>
<p> 10:20 rest parameters ... 배열로 풀어줌 + for...of  &amp; forEach</p>
<p> 12:40 local scope → (확장) →  closure, lexical scope 주요개념 : 밖에서는 안이 보이지 않고 안에서만 밖을 볼 수 있다!(변수 사용 범위)</p>
<p> 14:50 return 함수에 작성안하면 (return undefined) 가 생략된 채 작성된다. + early return : 여러개 검사 시 빨리 리턴을 해서 속도 up</p>
<p> 18:00 선언형 함수 ex) function sum() {..
 할당형 함수 ex) const print = function() {...
 선언형 함수는 완성되었을 때 제일 위로 올려진다. 그래서 선언 이전에 사용 가능함(호이스팅)</p>
<p> 18:34 callback function 매개변수가 함수인 경우를 의미</p>
<p> 23:17 IIFE Immediately Invoked Function Expression (function hello(){...})() 부르지 않아도 바로 실행가능</p>
<p> Quiz time</p>
<p> function calculate(cmd a, b)</p>
<p> command(add, substract, divide, multifly, remainder)</p>
</li>
</ol>
<pre><code class="language-javascript">function calculate(command, a, b) {
    if(command === &#39;add&#39;) return a+b;
    else if(command === &#39;substract&#39;) return a-b;
     else if(command === &#39;multiply&#39;) return a*b;
     else if(command === &#39;remainder&#39;) return a%b;
     else return &#39;Wrong command!&#39;
}

//정답 : command가 정해져 있다면 switch 문을 쓰는 것이 좋다.
function calculate(command, a, b) {
    switch (command) {
      case &#39;add&#39;:
        return a + b;
      case &#39;substract&#39;:
        return a - b;
      case &#39;multiply&#39;:
        return a * b;
      case &#39;remainder&#39;:
        return a % b;
      default:
        throw Error(&#39;unknown command&#39;);
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[드림코딩 자바스크립트 기초강의 정리4]]></title>
            <link>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC4</link>
            <guid>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC4</guid>
            <pubDate>Fri, 16 Jul 2021 03:34:18 GMT</pubDate>
            <description><![CDATA[<h3 id="코딩의-기본-operator-if-for-loop-코드리뷰-팁">코딩의 기본 operator, if, for loop 코드리뷰 팁</h3>
<p>10:00 or 사용시 무거운 값은 뒤쪽으로 보내라(꿀팁), null 값 false 이기 때문에 null 값 체크시 사용</p>
<p>13:00 0, &#39;&#39;은 == false 시 같은 걸로 취급 그러나 === false는 다른 것이다.
null == unidentify : true 이나 null === unidentify : false 이다.</p>
<p>14:45 ternary(?) operator 조건 ? 참 : 거짓</p>
<p>15: 15 switch</p>
<pre><code class="language-javascript">switch() {

case a:

//실행결과;

break;

}
</code></pre>
<p>typescript 에서 타입 검사 시 사용</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[드림코딩 자바스크립트 기초강의 정리3]]></title>
            <link>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC2-bai1eyi5</link>
            <guid>https://velog.io/@dongwookim_dev/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%9D%98-%EC%A0%95%EB%A6%AC2-bai1eyi5</guid>
            <pubDate>Thu, 15 Jul 2021 15:51:31 GMT</pubDate>
            <description><![CDATA[<h3 id="데이터타입-data-types-let-vs-var-hoisting">데이터타입, data types, let vs var, hoisting</h3>
<p>3:00 (mutable)let : 변수를 통해 값을 메모리에 저장, 값은 변경가능</p>
<p>5:07 scope: 변수가 적용되는 범위, 보통 블록{} 사이에 쓰면 블록 안에서만 적용된다.</p>
<p>6:17 var: 이전에 쓰던 데이터타입, var hoisting이 일어난다.(비추👎)</p>
<p>7:00 hoisting: 어디에 선언했냐에 상관없이 제일 위로 올라가는 것</p>
<p>9:19 (immutable)constant: 변수를 통해 값을 메모리에 저장, 값 변경 불가능!
(favor immutable type always! 항상 변경되지 않는 값을 선호하라!)</p>
<p>11:36 variable types: 
primitive, single item: number(특별 값: +-Infinity, NaN, bigInt(2^50 이상)), string, boolean, null, undefined(변수는 정의되었지만 값이 지정되지 않았을 때), symbol(map 같은 구조에서 고유한 식별자 필요할 때 사용)
object, box-container
function, first-class function</p>
<p>26:31 object: 여러 값들을 담아둘 수 있는 요소</p>
<pre><code class="language-javascript">const ellie = {name: ellie, age:25}</code></pre>
<p>const로 인해 ellie를 다른 object로 바꿀 수 없지만, ellie.name, ellie.age는 변경이 가능하다! </p>
]]></description>
        </item>
    </channel>
</rss>