<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>kassid_dev.log</title>
        <link>https://velog.io/</link>
        <description>🌊푸르지만 뜨겁게🔥</description>
        <lastBuildDate>Fri, 24 Dec 2021 15:57:10 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>kassid_dev.log</title>
            <url>https://images.velog.io/images/dev_kassid/profile/5a5bfa70-ba36-4021-b9d4-d1fc30fbf045/New Piskel (1).png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. kassid_dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_kassid" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[웹개발공부 (w.스파르타코딩클럽 / 4주차) 그리고 회고!]]></title>
            <link>https://velog.io/@dev_kassid/web5</link>
            <guid>https://velog.io/@dev_kassid/web5</guid>
            <pubDate>Fri, 24 Dec 2021 15:57:10 GMT</pubDate>
            <description><![CDATA[<h1 id="flask">Flask</h1>
<h2 id="들어가기-전에">들어가기 전에</h2>
<p>1,2주차에 공부를 했던 것은 웹의 &#39;프론트엔드&#39;부분이었다.
Html,CSS,JS 등으로 이것을 구현해보았고, 3주차부터는 &#39;백엔드&#39;부분을 공부하고 있는데 <code>서버개발환경</code>에 대해서 아주아주 간단하게 이야기해보면</p>
<ul>
<li>로컬개발환경
컴퓨터 1대로 개발 및 테스트환경, 서버까지 모두 구축을 한 환경을 이야기한다.
즉, <code>클라이언트=서버</code>인 상태이다.</li>
<li>현재 구축 중인 환경은?
이번 주차에 <code>Flask</code>를 이용하여 서버를 구축하고 DB는 <code>mongoDB Atlas</code>라는 클라우드를 이용하려 한다.</li>
</ul>
<h2 id="flask란">Flask란?</h2>
<h3 id="시작">시작</h3>
<p>Python에서 서버를 구축할 수 있게 도와주는 프레임워크이다.
(프레임워크=큰 라이브러리)</p>
<p>app.py라는 파일을 하나 생성한 뒤 아래의 코드를 실행시켜주면</p>
<pre><code class="language-python">import flask
from flask.app import Flask


from flask import Flask
app = Flask(__name__)

@app.route(&#39;/&#39;)
def home():
    return &#39;This is Home!&#39;

if __name__==&#39;__main__&#39;:
    app.run(&#39;0.0.0.0&#39;,port=5000,debug=True)</code></pre>
<img border=1 src=https://images.velog.io/images/dev_kassid/post/09bc4412-0282-40fa-baa9-27879fe3c6aa/image.png>

<h3 id="localhost5000의-의미">localhost:5000의 의미</h3>
<p>사용자마다 고유의 IP가 있는데 플라스크는 이 IP를 사용하지 않고
<code>localhost</code>라고 알려진 인터넷의 루프백 주소 <code>127.0.0.1</code>을 사용한다.</p>
<p><code>루프백 주소</code>는 웹 서버나 네트워크 동작 기능을 테스트하는 데에 사용하고,
자신에게 다시 데이터가 돌아오게 하는 방식이다!</p>
<h3 id="url나누기">URL나누기</h3>
<p><code>@app/route()</code>를 수정해서 URL을 나눠보자!</p>
<p>이때 주의할 점 2가지</p>
<ul>
<li>url별로 함수명이 같으면 안된다.</li>
<li>route(&#39;/&#39;)내의 주소가 같으면 안된다!</li>
</ul>
<pre><code class="language-python">import flask
from flask.app import Flask


from flask import Flask
app = Flask(__name__)

@app.route(&#39;/&#39;)
def home():
    return &#39;This is my Home!&#39;

@app.route(&#39;/mypage&#39;)
def mypage():
    return &#39;This is myPage!!&#39;

if __name__==&#39;__main__&#39;:
    app.run(&#39;0.0.0.0&#39;,port=5000,debug=True)</code></pre>
<img border=1 src=https://images.velog.io/images/dev_kassid/post/8735affc-66a0-437b-a500-2e0c050ed70f/image.png>

<p>이렇게 새로운 페이지를 추가할 수 있다.</p>
<h3 id="구조">구조</h3>
<p>Flask 서버를 만들 때는 정해진 구조가 있다.</p>
<ul>
<li><code>static</code> : 이미지, css파일을 넣는다.</li>
<li><code>templates</code> : html파일을 넣는다.</li>
<li><code>app.py</code></li>
</ul>
<h4 id="templates">templates</h4>
<p><code>templates</code>폴더 안에 html파일을 하나 생성하고
내용을 채워준다.</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;나의 첫 웹페이지&lt;/h1&gt;
    &lt;button&gt;Here we go!&lt;/button&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>그 후에 app.py를 수정해준다.
<code>render_template</code>을 import 해주고 <code>@app.route(&#39;/&#39;)</code>의 반환값을 바꿔준다.</p>
<pre><code class="language-python">from flask import Flask, render_template
app = Flask(__name__)

@app.route(&#39;/&#39;)
def home():
    return render_template(&#39;index.html&#39;)

@app.route(&#39;/mypage&#39;)
def mypage():
    return &#39;This is myPage!!&#39;

if __name__==&#39;__main__&#39;:
    app.run(&#39;0.0.0.0&#39;,port=5000,debug=True)</code></pre>
<h2 id="api만들기">API만들기</h2>
<p>Flask의 <code>jsonify</code>를 이용하면 <code>데이터를 json형태로 보내주는 API서버</code>를 만들 수 있다.</p>
<p>2주차에서 다뤘었던 <code>jQuary</code>와 <code>ajax</code>를 활용할 것인데 복습 겸 다시 API를 조금
이야기 해보면</p>
<p>API는 클라이언트와 서버를 이어주는 역할을 해주고, 이 때 서버의 요청을 할 때에는
<code>Html 메서드</code>로 그 종류를 알려줄 수 있다.</p>
<p>2주차에는 조회를 하는 <code>GET</code>을 다뤘었고 이번에는 데이터의 생성, 변경, 삭제에 사용을 하는
<code>POST</code>를 이용해보았다!</p>
<h4 id="html">html</h4>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;Title&lt;/title&gt;
    &lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        function hey(){
            $.ajax({
                type: &quot;POST&quot;,
                url: &quot;/test&quot;,
                data: { say_Hi:&#39;안녕하세요&#39; },
                success: function(response){
                    console.log(response[&#39;msg&#39;])
                }
            })
        }

    &lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;h1&gt;나의 첫 웹페이지&lt;/h1&gt;
    &lt;button onclick=&quot;hey()&quot;&gt;Here we go!&lt;/button&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre>
<p><code>GET</code>과 <code>POST</code>의 차이점은 Ajax코드에서 <code>data</code>에 값을 넣어주는 것이다.
딕셔너리 형태로 넣어주면 된다.</p>
<h4 id="apppy">app.py</h4>
<pre><code class="language-python"># app.py
from flask import Flask, render_template, jsonify, request
app = Flask(__name__)

@app.route(&#39;/&#39;)
def home():
    return render_template(&#39;index.html&#39;)


@app.route(&#39;/test&#39;, methods=[&#39;POST&#39;])
def test_post():
    receive_Hi = request.form[&#39;say_Hi&#39;] #클라이언트에서 받은 정보
    print(receive_Hi) #클라이언트에서 받은 정보 출력
    return jsonify({&#39;result&#39;:&#39;success&#39;, &#39;msg&#39;: &#39;요청완료!&#39;})


if __name__==&#39;__main__&#39;:
    app.run(&#39;0.0.0.0&#39;,port=5000,debug=True)</code></pre>
<p>html파일은 <code>클라이언트</code> 코드이고 app.py는 <code>서버</code> 코드 이다.</p>
<p>html파일에서 버튼을 눌렀을 때 <code>hey()</code>라는 함수를 실행하도록 해놓았다.
hey()함수는 서버에 <code>Post</code>요청을 보내고, app.py에서 <code>Post</code> 요청을 받는다.</p>
<p>클라이언트에서 서버로 <code>data</code>에 할당된 <code>{ say_Hi:&#39;안녕하세요&#39; }</code>가 전달이 된다.
<strong>app.py를 실행시켜 확인해 보면 &#39;안녕하세요&#39; 라고 출력이 되는 것을 알 수 있다.</strong></p>
<p>즉, 클라이언트의 요청이 서버에 잘 도착한 것이다.</p>
<p>서버에서는 받은 요청에 대해서 처릴를 한 후 jsonify로 이용해 클라이언트로
json response를 보낸다.</p>
<p><strong>웹사이트를 실행시켜서 버튼을 누르면 콘솔창에 &#39;요청완료!&#39; 라고 출력이 된다.</strong></p>
<hr>
<h1 id="수업을-듣고-해본-것들">수업을 듣고 해본 것들</h1>
<h3 id="1-나만의-영화-평점-사이트">1. 나만의 영화 평점 사이트</h3>
<img border=1 src=https://images.velog.io/images/dev_kassid/post/ae9a89e9-77a7-45bb-8a44-aec2edadf060/image.png>

<p>3주차에 진행했던 웹 크롤링을 이용해서 og(Open Graph)타이틀과 포스터이미지, 요약을 가져왔다.
저번처럼 선택자 복사를 그대로 이용하면 크롤링이 되지 않아서
<code>soup.select_one(&#39;meta[property=&quot;og:title&quot;]&#39;)[&#39;content&#39;]</code>
위와 같이 접근하여 가져왔다.</p>
<img border=1 src=https://images.velog.io/images/dev_kassid/post/a459a6a6-ecd1-4976-a690-a4502a5b0b21/image.png>

<p>위와 같은 입력칸에 정보를 입력하면, DB에 저장이 된다.</p>
<img border=1 src=https://images.velog.io/images/dev_kassid/post/6f5205ad-9d83-43fe-baa1-dd829620ce80/image.png>

<p>POST를 하면 <code>window.location.reload()</code>를 통해서 새로고침을 해주고,</p>
<p><code>$(document).ready(function () { GET요청 함수 });</code> 를 통해서
새 창이 로드되면 GET요청을 통해 DB에서 정보를 가져오도록 하였다.</p>
<p>서버에서 받아온 데이터를 바탕으로 html뼈대를 붙여주어서
영화 평가컨텐츠가 추가 되도록 하였다!</p>
<h3 id="2-버킷리스트">2. 버킷리스트</h3>
<img border=1 src=https://images.velog.io/images/dev_kassid/post/7bc9b343-a698-4809-8eb0-ea90ab00e58a/image.png>

<p>버킷리스트를 만들어보았는데 GET, POST로 입력한 리스트를 추가하는 것은
위와 동일하다.</p>
<img border=1 src=https://images.velog.io/images/dev_kassid/post/97e1137b-d765-4bd3-96f7-1cb0b4312d18/image.png>

<p><code>완료</code>버튼을 누르면 빗금을 긋기를 요청하기 위해서
DB에 기록을 할 때 <code>index</code> 를 주었고,
버튼을 눌렀을 때 그 <code>index에 해당하는 DB</code>의 완료 여부를 담는 변수인 <code>done</code>의 정보를 바꾸어 주었다.</p>
<pre><code class="language-python">db.bucket.update_one({조건},{&#39;$set&#39;:수정사항})</code></pre>
<p>위의 코드를 이용하여 DB에 저장된 데이터를 수정할 수 있다.</p>
<p>GET으로 로드한 DB의 데이터 중 <code>done</code>변수에 따라
if문으로 case를 나눠서 붙여줄 html을 다르게 작성해주었다.</p>
<hr>
<h1 id="끝내며">끝내며</h1>
<p>스파르타 코딩클럽 웹 프로그래밍 강의의 5주차까지 모두 완주하였다!
5주차에는 aws를 이용하여 배포까지 해보았다.
서포터즈 활동을 하며 받은 강의였는데 무언가를 만들기에 최적화된 강의였다.
하지만 전공자들이 웹이 돌아가는 메커니즘이라던가 여러가지 확실히 배우고
싶어서 듣기에는 적합하지는 않았던 것 같다.</p>
<p>반대로 말하면 웹이라는 것을 경험하지 않은 사람들이 빠르게 결과물을 내면서 배우기에는 아주 좋은 환경을 제공해준다는 것이다!</p>
<p>나의 경우에는 웹을 경험해보지 않아서 강의를 듣고 velog 포스팅을 할 때
구글링을 통해 조금 더 찾아보면서 공부를 하게 된 것 같다.
그리고 직접 간단한 여러 프로젝트를 만들다보니 뭔가의 기능을 더 넣어 보고 싶어서 배우고 싶은 열망을 만들어 주었던 강의였다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발공부 (w.스파르타코딩클럽 / 3주차)-2]]></title>
            <link>https://velog.io/@dev_kassid/web4</link>
            <guid>https://velog.io/@dev_kassid/web4</guid>
            <pubDate>Sat, 04 Dec 2021 14:04:08 GMT</pubDate>
            <description><![CDATA[<h1 id="mongodb-조작">mongoDB 조작</h1>
<p><code>mongoDB</code>를 <code>pymongo</code> 라이브러리를 활용해서 조작해보았다.</p>
<h2 id="1-저장">1. 저장</h2>
<p>예시와 함께 알아보면,</p>
<pre><code class="language-python">from pymongo import MongoClient
client = MongoClient(&#39;DB경로&#39;)

db = client.prac
doc = {&#39;name&#39;:&#39;bobby&#39;,&#39;age&#39;:21}
doc1 = {&#39;name&#39;:&#39;mary&#39;,&#39;age&#39;:23}

db.users.insert_one(doc)
db.users.insert_one(doc1)</code></pre>
<p><code>.inset_one()</code>을 이용해 넣고싶은 데이터를 넣어주면 값이 저장이 된다.</p>
<img border=1 src=https://images.velog.io/images/dev_kassid/post/04f73fbb-1553-4624-8b52-6be03ea96104/image.png>

<hr>
<h2 id="2-찾기">2. 찾기</h2>
<h3 id="한-개만-찾을-때">한 개만 찾을 때</h3>
<h4 id="input">input</h4>
<pre><code class="language-python">user = db.users.find_one({&#39;name&#39;:&#39;bobby&#39;})</code></pre>
<p><code>.find_one()</code>을 이용하면 한 개의 데이터만 가져올 수 있다.
조건을 인수로 주면 된다.</p>
<h4 id="output">output</h4>
<pre><code>{&#39;_id&#39;: ObjectId(&#39;61ab21751b4b580ad5892475&#39;), &#39;name&#39;: &#39;bobby&#39;, &#39;age&#39;: 21}</code></pre><p>위와 같은 결과를 얻을 수 있다.</p>
<h3 id="여러-개-찾을-때">여러 개 찾을 때</h3>
<pre><code class="language-python"># all_users = list(db.users.find({조건})) #리스트로 형변환하여 처리해주었다.
all_users = list(db.users.find({}))</code></pre>
<p><code>.find()</code>를 이용하면 여러 개의 데이터를 가져올 수 있다.
이때 빈 조건을 넣어주면 모두 가져올 수 있다.</p>
<h4 id="input-1">input</h4>
<pre><code class="language-python">all_users = list(db.users.find({},{&#39;_id&#39;:False}))
# {_&#39;id&#39;}는 필요없는 데이터이므로 지워주었다.</code></pre>
<h4 id="output-1">output</h4>
<pre><code class="language-python">[{&#39;name&#39;: &#39;bobby&#39;, &#39;age&#39;: 21}, {&#39;name&#39;: &#39;mary&#39;, &#39;age&#39;: 23}]</code></pre>
<hr>
<h2 id="3-바꾸기">3. 바꾸기</h2>
<h4 id="input-2">input</h4>
<pre><code class="language-python"># db.users.update_one(조건,{&#39;$set&#39;:바꿀 내용})
db.users.update_one({&#39;name&#39;:&#39;bobby&#39;},{&#39;$set&#39;:{&#39;age&#39;:19}})</code></pre>
<h4 id="output-2">output</h4>
<img border=1 src=https://images.velog.io/images/dev_kassid/post/941d7bd4-6006-4887-9652-b01617713f1f/image.png>

<p>위와 같은 방법으로 데이터의 내용을 바꿔줄 수 있다.</p>
<hr>
<h2 id="4-제거">4. 제거</h2>
<h4 id="input-3">input</h4>
<pre><code class="language-python">db.users.delete_one({&#39;name&#39;:&#39;bobby&#39;})</code></pre>
<h4 id="output-3">output</h4>
<img border=1 src=https://images.velog.io/images/dev_kassid/post/3651cc81-4975-4cf0-8944-ae7941705261/image.png>

<p>제거도 가능하다!</p>
<hr>
<h1 id="배운-것으로-한-것들">배운 것으로 한 것들</h1>
<h2 id="1-입대한-달-지니차트-크롤링">1. 입대한 달 지니차트 크롤링</h2>
<img src=https://images.velog.io/images/dev_kassid/post/ccc306b6-ee38-4c03-b4c8-466b1c035abb/image.png>

<img src=https://images.velog.io/images/dev_kassid/post/facf6ecc-e08f-4614-856e-74f278ae57b3/image.png>


<h2 id="2-리그오브레전드-최근-20게임-전적-통계">2. 리그오브레전드 최근 20게임 전적 통계</h2>
<p>게임 닉네임을 입력하면
해당 유저의 최근 20게임의 결과를 크롤링하고
승리,패배 횟수와 승률을 보여주는 코드입니다!</p>
<img src=https://images.velog.io/images/dev_kassid/post/715129fc-804f-4c01-89e1-b5dcd9cc43b4/image.png>]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발공부 (w.스파르타코딩클럽 / 3주차)-1]]></title>
            <link>https://velog.io/@dev_kassid/web3</link>
            <guid>https://velog.io/@dev_kassid/web3</guid>
            <pubDate>Sat, 04 Dec 2021 07:35:22 GMT</pubDate>
            <description><![CDATA[<h1 id="웹-스크래핑크롤링">웹 스크래핑(크롤링)</h1>
<p>크롤링(Crawling)은 사전적 의미로는 기어다니는 것을 뜻한다.
웹에서 이 의미를 적용하면 <code>웹 상을 돌아다니며 정보를 수집하는 것</code>이다.</p>
<p>다시 말하면, 문서나 API 등에서 데이터를 수집하고 사용자의 입맛에 맞춰
필요한 정보만 추출하여 처리하는 것을 이야기한다!</p>
<p>파이썬을 이용해서 진행을 하는데 총 2가지 라이브러리를 활용하였다.</p>
<ol>
<li>html을 가져온다 - <code>requests</code></li>
<li>필요한 데이터를 걸러낸다 - <code>bs4 (beautifulsoup4)</code></li>
</ol>
<hr>
<h2 id="크롤링을-위한-준비">크롤링을 위한 준비</h2>
<p>수업에서는 네이버 영화페이지에서 제목 가져오기를 진행했다!</p>
<img width=400 src=https://images.velog.io/images/dev_kassid/post/fbfd3f95-786c-473b-ba99-ad4d2e7ac027/image.png>

<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://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&amp;tg=0&amp;date=20211202&#39;,headers=headers)

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

title = soup.select_one(&#39;#old_content &gt; table &gt; tbody &gt; tr:nth-child(2) &gt; td.title &gt; div &gt; a&#39;)
print(title)</code></pre>
<p>위의 코드가 그 시작인데
하나씩 알아보면</p>
<ul>
<li><p><code>headers</code> : 접속하는 사람/프로그램에 대한 정보
크롤링 할 때 서버에서 사용자를 봇으로 인지하여 정보를 주지 않고 &#39;차단&#39;하는 경우가 있습니다.
이때 headers정보에 User-Agent를 넣어주면 되는데,
<a href="http://www.useragentstring.com/">http://www.useragentstring.com/</a>
위 링크에서 복사해오면 된다!</p>
</li>
<li><p><code>data</code> : requests 라이브러리를 활용해 데이터를 가져올 <code>url</code>과 <code>headers 정보</code>를 준다.</p>
</li>
<li><p><code>title</code> : 변수를 하나 생성해준 뒤 bs4 라이브러리를 활용해서 html정보를 가져온다.</p>
</li>
</ul>
<p>html정보를 가져올 때에는 html의 <code>선택자 복사</code> 기능을 이용한다!</p>
<img border=1 width=450 src=https://images.velog.io/images/dev_kassid/post/b4e58dca-2aca-42df-9330-531f3b9212da/image.png>

<p>위와 같이 복사를 해준 뒤 문자열 형태로 <code>soup.slect_one()</code>의 인수로 넣어주면 된다.</p>
<pre><code>&lt;a href=&quot;/movie/bi/mi/basic.naver?code=186114&quot; title=&quot;밥정&quot;&gt;밥정&lt;/a&gt;</code></pre><p>그렇게 해주면 원하는 html코드를 가져올 수 있다.</p>
<hr>
<h2 id="제목-가져오기">제목 가져오기</h2>
<pre><code>#old_content &gt; table &gt; tbody &gt; tr:nth-child(3) &gt; td.title &gt; div &gt; a
#old_content &gt; table &gt; tbody &gt; tr:nth-child(4) &gt; td.title &gt; div &gt; a</code></pre><p>선택자 복사를 통해서 서로 다른 두 제목 정보를 비교해보면
<code>old_content &gt; table &gt; tbody &gt; tr</code> 까지 동일하고
그 후 숫자로 구분을 한 뒤
다시 <code>td.title &gt; div &gt; a</code> 부분이 동일한 것을 알 수 있다.</p>
<img border=1 width=450 src=https://images.velog.io/images/dev_kassid/post/7eb22016-8847-46ff-8d15-aeb6310ccfc4/image.png>

<p><code>old_content &gt; table &gt; tbody &gt; tr</code> 은 영화칸까지 접근을 한 경로이고,
<code>td.title &gt; div &gt; a</code> 는 제목링크까지 접근한 것을 알 수 있다.
이 경로에서 <code>제목 정보</code>를 얻을 수 있다!</p>
<pre><code class="language-python">movies = soup.select(&#39;#old_content &gt; table &gt; tbody &gt; tr&#39;)

for movie in movies:
    a = movie.select_one(&#39;td.title &gt; div &gt; a&#39;)
    if a is not None:
        print(a.text)</code></pre>
<p><code>movies</code>변수에 <code>.select</code>를 통해 결과값을 &#39;리스트 형태&#39;로 저장해 준다.
그 후, <code>.select_one</code>을 이용해서 하나씩 값을 가져온다.
<code>.select_one</code>의 경우에는 속성값을 가져올 수 있기 때문에
<code>.text</code>로 제목값만 가져온다!
(구분선으로 되어있는 부분은 None을 반환하기 때문에 예외처리를 해주었다.)</p>
<img src=https://images.velog.io/images/dev_kassid/post/5566bd0c-1a2f-4963-9664-8b0d40d8339c/image.png>

<hr>
<p>위에서 한 것에 추가로 순위와 평점 정보도 가져왔다.
이번에도 <code>선택자 복사</code> 기능을 이용하면 정말 편하게 할 수 있다!</p>
<pre><code class="language-python">for movie in movies:
    a = movie.select_one(&#39;td.title &gt; div &gt; a&#39;)
    if a is not None:
        title = a.text
        rank = movie.select_one(&#39;td:nth-child(1) &gt; img&#39;)[&#39;alt&#39;]
        point = movie.select_one(&#39;td.point&#39;).text
        print(rank,title,point)</code></pre>
<img src=https://images.velog.io/images/dev_kassid/post/059f87cb-5a40-47ed-b4cd-b7f851614d38/image.png>

<hr>
<h1 id="db">DB</h1>
<p>DB(데이터 베이스)는 여러 사람이 공유하며 사용할 목적으로
체계화하여 통합, 관리를 하는 <code>데이터의 집합</code>이다.</p>
<p>&#39;데이터를 쉽게 뽑아쓰기 위해서!&#39;가 간단하게 표현한 DB의 목적이라고 할 수 있다.</p>
<p>DB는 <code>Index</code>라는 순서로 데이터들이 정렬되어있고 그것을 통해 쉽게 원하는 것들을
찾아낼 수 있다!</p>
<h2 id="종류">종류</h2>
<h3 id="1-sql">1. SQL</h3>
<p>칸을 만들고 채워넣는 방식. 행-열이 있는 엑셀과 비슷함!
<code>정형화</code> 되어 있기 때문에 그만큼 데이터가 <code>일관성</code>이 있고, 분석에 용이하다.
즉, 찾고 싶은 데이터도 보다 더 쉽게 찾을 수 있다.</p>
<p>그러나 많은 양의 데이터가 쌓여있는 상태에서 중간에 변화를 줄 때
유연하게 다루기가 어렵다.
ex) MS-SQL, My-SQL 등</p>
<h3 id="2-nosqlnot-only-sql">2. NoSQL(Not only SQL)</h3>
<p>딕셔너리 형태로 데이터를 저장.
들어오는 대로 쌓는 자유로운 형태이기 때문에 <code>변화에 유연하게 대처가능</code>하다는 장점이 있다.
그래서 초기 스타트업과 같은 소규모 단위에서 주로 사용하는 방식이다.</p>
<p>하지만 그 반대로 데이터의 일관성이 부족하다는 단점이 있다!
ex) MongoDB</p>
<h2 id="db의-실체">DB의 실체</h2>
<p>DB는 우리가 사용하는 <code>프로그램</code>이다.
데이터를 잘 쌓고 관리하는 데에 용이한 프로그램이다!
따라서 사용하고 있는 컴퓨터에도 DB를 설치할 수 있는데</p>
<p>요즈음에는 클라우드환경을 많이 이용한다.
유저 트래픽이 몰리거나 / 백업이 필요하거나 / 모니터링을 해야 할 때 매우 용이하기 때문이다.</p>
<p>수업에서는 mongoDB를 클라우드에서 제공해주는 <code>mongoDB Atlas</code>를 활용하였다!</p>
<hr>
<h2 id="mongodb-atlsas-튜토리얼">mongoDB Atlsas 튜토리얼</h2>
<p>mongoDB link:
<a href="https://www.mongodb.com/atlas/database">https://www.mongodb.com/atlas/database</a></p>
<img width=400 border=1 src=https://images.velog.io/images/dev_kassid/post/4fab695f-a752-4c79-94ae-a6eb7898d485/image.png>

<img width=400 border=1 src=https://images.velog.io/images/dev_kassid/post/08f5dcc0-0b9e-41a0-b643-9f2adc9008f5/image.png>

<p>무료로 시작을 해준 뒤, 클라우드 지역설정과 클러스터의 이름을 설정해준다.
(<code>myCluster</code>로 지어주었다!)</p>
<img border=1 src=https://images.velog.io/images/dev_kassid/post/01435b35-dbec-42e2-b9b9-924542210968/image.png>
그 후에 잠시 기다려주면 위와 같이 생성완료!

<p><code>Connect</code>버튼을 눌러준 뒤</p>
<img width=400 border=1 src=https://images.velog.io/images/dev_kassid/post/cab25e2a-a450-4cc9-8470-26d081934d06/image.png>

<p><code>Connect your application</code>버튼을 누르고
보안설정으로 <code>Username</code>과 <code>Password</code>를 입력해주고</p>
<img width=400 border=1 src=https://images.velog.io/images/dev_kassid/post/78f5ccc1-693c-4d53-8adb-ccd50c9d56b2/image.png>

<p>드라이버 설정을 해준다.</p>
<img width=400 border=1 src=https://images.velog.io/images/dev_kassid/post/3d17c9cd-550d-42b0-8721-aa3b5f03f493/image.png>

<p>위 사진에서 보이는 코드를 복사해온 뒤</p>
<pre><code>mongodb+srv://test:&lt;password&gt;@mycluster.aq6co.mongodb.net/myFirstDatabase?retryWrites=true&amp;w=majority

mongodb+srv://test:(설정한 패스워드)@mycluster.aq6co.mongodb.net/(클러스터명)?retryWrites=true&amp;w=majority</code></pre><p>위와 같이 변경을 해준다!</p>
<pre><code class="language-python">from pymongo import MongoClient
client = MongoClient(&#39;mongodb+srv://test:kassid@mycluster.aq6co.mongodb.net/myCluster?retryWrites=true&amp;w=majority&#39;)

#db = client.(db명)
db = client.kassid

doc = {
    &#39;name&#39; : &#39;kassid&#39;,
    &#39;age&#39;: 23
}

#db.(컬렉션명).insert_one(넣고싶은 자료)
db.admin.insert_one(doc)</code></pre>
<img width=500 border=1 src=https://images.velog.io/images/dev_kassid/post/ff1664e6-ecc5-4b13-a4d3-6e4e688a7202/image.png>

<p><code>Collections</code>를 확인해보면 데이터가 잘 들어와있는 것을 알 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발공부 (w.스파르타코딩클럽 / 2주차)
]]></title>
            <link>https://velog.io/@dev_kassid/web2</link>
            <guid>https://velog.io/@dev_kassid/web2</guid>
            <pubDate>Thu, 02 Dec 2021 12:39:13 GMT</pubDate>
            <description><![CDATA[<h1 id="1-jquery">1. jQuery</h1>
<h2 id="개요">개요</h2>
<p>Html의 요소들을 조작하는 Javascript를 미리 작성해둔 것이다.
Javascript로 길고 복잡하게 써야 하는 것들을 jQuery로 보다 직관적으로 쓸 수 있게 해준다!</p>
<h2 id="사용방법">사용방법</h2>
<p>사용방법은 2가지가 있다.</p>
<ol>
<li>직접 서비스 하는 방법</li>
<li>구글의 JS 라이브러리를 사용하는 방법(CDN/Content Delivery Network)</li>
</ol>
<p>이 중 2번째 방법으로 사용을 해보았다.</p>
<p><a href="https://www.w3schools.com/jquery/jquery_get_started.asp">https://www.w3schools.com/jquery/jquery_get_started.asp</a>
위 링크에서 아래 코드를 복사해서 넣어주면 된다.</p>
<pre><code>&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&quot;&gt;&lt;/script&gt;</code></pre><h2 id="문법">문법</h2>
<pre><code>$(제어대상).method();</code></pre><p>jQuery는 <code>$</code>로 시작하고 인자값으로 CSS의 <code>선택자</code>를 줄 수 있다.</p>
<hr>
<h3 id="예시-1">예시 1</h3>
<pre><code>&lt;body&gt;
    &lt;input type=&quot;text&quot;&gt;
&lt;/body&gt;</code></pre><img src=https://images.velog.io/images/dev_kassid/post/3e4aaa1d-4c81-4f47-9a24-db65dc9435c5/image.png>
입력창을 하나 만든 후

<img src=https://images.velog.io/images/dev_kassid/post/679cded9-c961-4813-bd1c-9fe8cac06b23/image.png border=1px>
콘솔창에 위와 같이 jQuery를 작성해주면
<img src=https://images.velog.io/images/dev_kassid/post/470fb036-c1ad-4070-a15b-92318ccf0ee6/image.png>
이렇게 값을 넣어줄 수 있다.

<p>반대로 값을 받는 방법도 있다.
<img src=https://images.velog.io/images/dev_kassid/post/65b6d19b-4f55-40ce-824a-36114e2acf8f/image.png align='left' border=1></p>
<hr>
<h3 id="예시-2">예시 2</h3>
<p>Html을 붙이거나 지우는 것도 가능하다!</p>
<pre><code>&lt;div class=&quot;question-box&quot;&gt;
        &lt;input id=&quot;input-txt&quot; type=&quot;text&quot; placeholder=&quot;여기에 이름을 입력&quot; /&gt;
        &lt;button onclick=&quot;txt_append()&quot;&gt;이름 붙이기&lt;/button&gt;
        &lt;button onclick=&quot;txt_remove()&quot;&gt;모두 지우기&lt;/button&gt;
        &lt;ul id=&quot;names&quot;&gt;
            &lt;li&gt;김갑생&lt;/li&gt;
            &lt;li&gt;김말숙&lt;/li&gt;
        &lt;/ul&gt;
&lt;/div&gt;</code></pre><img border=1 src='https://images.velog.io/images/dev_kassid/post/4a31d3c8-baaa-41f3-ba36-43f91d14cbe9/image.png'>
위와 같은 입력 칸을 만들어 주었을 때
`이름 붙이기`를 누르면 리스트가 추가가 되고
`모두 지우기`를 누르면 초기화가 되는 것을 한 번 구현해보면

<pre><code>&lt;script&gt;
        function txt_append(){
            let temp_html = $(&#39;#input-txt&#39;).val()
            $(&quot;#names&quot;).append(`&lt;li&gt;${temp_html}&lt;/li&gt;`)
        }
        function txt_remove(){
            $(&quot;#names&quot;).empty()
        }
&lt;/script&gt;</code></pre><ol>
<li>추가하기</li>
</ol>
<img border=1 src='https://images.velog.io/images/dev_kassid/post/876804fa-3a31-40a5-8287-692d0751edf9/image.png'>

<ol start="2">
<li>모두 지우기</li>
</ol>
<img border=1 src='https://images.velog.io/images/dev_kassid/post/52668ce3-6c5a-448e-98b6-2a3fd2a9ae8c/image.png'>

<p>여기에서 html코드를 넣어줄 때에는 &#39;(따옴표)가 아닌 backtick으로 감싸야한다.</p>
<p>이를 이용하여 문자열 중간에 포매팅을 할 수 있다!</p>
<hr>
<h1 id="2-서버-클라이언트-통신">2. 서버-클라이언트 통신</h1>
<h2 id="api">API</h2>
<p>API는 프로그램들이 서로 상호작용하는 것을 돕는 매개체이다.
이를 비유로 설명하면,
<code>서버</code>를 은행이라고 했을 때, <code>클라이언트</code>를 고객, <code>API</code>를 은행창구라고 할 수 있다.</p>
<p>같은 예금 창구에서도 개인 대상, 기업 대상에 따라 가져와야 할 것과 처리해야 할 것들이 다른 것처럼
요청을 할 때에도 &#39;타입&#39;이 존재한다!</p>
<p>이는 <code>HTTP 메서드(Method)</code>로 서버에 요청종류를 알릴 수 있다.</p>
<h3 id="http-메서드">HTTP 메서드</h3>
<p>메소드의 종류는 아주 많지만 이번에는 <code>GET</code>과 <code>POST</code>에 대해서 공부해보았다.</p>
<ul>
<li><p><code>GET</code>은 보통 데이터 <code>조회(Read)</code>를 요청할 때 사용한다.
ex) 영화 목록 조회, 오늘의 날씨 조회 등</p>
</li>
<li><p><code>POST</code>는 보통 데이터의 <code>생성(Create)</code>, <code>변경(Update)</code>, <code>삭제(Delete)</code>를 요청할 때 사용한다.
ex) 계정 생성, 계정 삭제, 계정 정보변경</p>
</li>
</ul>
<h4 id="get">GET</h4>
<p>예시와 함께 알아보자!</p>
<pre><code>https://movie.naver.com/movie/bi/mi/basic.nhn?code=161967</code></pre><p>다음을 나눠서 보면 
<code>http 서버주소 /api주소 ?전달할 데이터</code> 로 이뤄져 있는 것이다.</p>
<p>여기에서</p>
<ul>
<li>? : 이 부분부터 전달할 데이터가 작성된다라는 의미를 담고 있다.</li>
<li>&amp; : 전달할 데이터를 이어주는 역할 (위의 예시에는 나와있지 않지만!)</li>
<li>추가정보
ex) google.com/search?q=갤럭시&amp;sourced=chrome&amp;ie=UTF-8
  q (검색어) | sourced (브라우저 정보) | ie (인코딩 정보)</li>
</ul>
<h2 id="json">JSON</h2>
<p>JSON(JavaScript Object Notation)은 JS 객체 문법으로 <code>구조화된 데이터</code>를 표현하기 위한 문자 기반의 포맷이다.
HTML로 만들어진 구조에 데이터를 씌워주기 위해서 사용하는데
주로 모바일 어플리케이션에서 많이 사용한다.</p>
<h4 id="구조">구조</h4>
<p><code>딕셔너리</code> 형태인 <code>key:value</code>로 이뤄져 있다.
ex)</p>
<pre><code>Profile:{
    name:&#39;Kassid&#39;
    age:23
    ...
}</code></pre><hr>
<h1 id="3-ajax">3. Ajax</h1>
<p>Ajax(Asynchronous JavaScript and XML)는 빠르게 동작하는 동적인 웹 페이지를 만들기 위한 개발 기법의 하나이다.
이를 이용하면 웹페이지 전체를 로딩하지 않고도 일부분을 갱신할 수 있다.</p>
<h2 id="구조-1">구조</h2>
<p>jQuery를 이용해서 Ajax를 구현해보자.(GET 방식)</p>
<pre><code>$.ajax({
  type: &quot;GET&quot;,
  url: &quot;URL넣기&quot;,
  data: {}, //요청하며 줄 데이터, GET방식일 때에는 비워두기
  success: function(result){
    // 서버에서 준 결과를 이용해서 나머지 코드를 작성
  error: function(error){

  }
})</code></pre><p>위와 같은 형태를 띄고 있다.</p>
<h3 id="예시">예시</h3>
<p>서울시 미세먼지 정보 오픈API
<a href="http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99">http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99</a></p>
<pre><code>$.ajax({
                type: &quot;GET&quot;,
                url: &quot;http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99&quot;,
                data: {},
                success: function (response) {
                    let rows = response[&#39;RealtimeCityAir&#39;][&#39;row&#39;]
                    for (let i=0; i&lt;rows.length; i++){
                        let gu_name = rows[i][&#39;MSRSTE_NM&#39;]
                        let gu_mise = rows[i][&#39;IDEX_MVL&#39;]
                        console.log(gu_name,gu_mise)
                    }
                }
            })</code></pre><p>위 코드를 콘솔창에서 확인해보면
다음과 같은 결과를 얻을 수 있다.</p>
<img align=left border=1 src=https://images.velog.io/images/dev_kassid/post/9bd7cfb8-592e-49d7-ac2d-e19d30a85958/image.png>

<hr>
<h3 id="더-배운-내용">더 배운 내용</h3>
<img width=500 border=1 src=https://images.velog.io/images/dev_kassid/post/46fb818a-0241-4ca3-8064-17f071f4aeb5/%EB%AC%B4%EC%A0%9C.png>

<p>1주차에 만들었던 팬페이지에 &#39;온도 정보&#39;를 추가하였다.
날씨api에서 받아와서 페이지를 로딩하면
자동으로 api에서 정보를 업데이트 하도록 구현되어 있다.</p>
<pre><code>$(&#39;적용할 선택자&#39;).text(&#39;대체할 텍스트&#39;)</code></pre><p>위의 코드는 jQuery를 이용하여 text를 바꿔줄 때 사용한다.</p>
<pre><code>$(&#39;적용할 선택자&#39;).attr(src,&#39;대체할 이미지 경로&#39;)</code></pre><p>이미지를 바꿔줄 때에는 이렇게!
<code>attr()</code>는 속성을 부여하는 메서드인데 위와 같이 활용을 하면
이미지를 변경할 수 있다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발공부 (w.스파르타코딩클럽 / 1주차)]]></title>
            <link>https://velog.io/@dev_kassid/web1</link>
            <guid>https://velog.io/@dev_kassid/web1</guid>
            <pubDate>Sun, 28 Nov 2021 17:56:54 GMT</pubDate>
            <description><![CDATA[<p>스파르타 코딩클럽 서포터즈 &#39;르탄즈&#39; 활동 중 우수 활동자로 발탁이 되어서</p>
<p>&#39;웹개발 종합반&#39;이라는 정규강의를 수강할 수 있는 좋은 기회를 얻게 되었다!</p>
<p>5주간 웹의 동작 원리부터 Html Css JS 그리고 직접 나만의 웹서비스를 만들 수 있는</p>
<p>커리큘럼이 짜여져 있다.</p>
<p>그 시작으로 1주차 수업을 듣고 나서 배운 내용을 간단히 정리 해보려고 한다!</p>
<hr>
<h1 id="1-서버클라인트웹-동작-개념">1. 서버/클라인트/웹 동작 개념</h1>
<h2 id="1-1-웹-동작-개념html을-받을-때">1-1 웹 동작 개념(HTML을 받을 때)</h2>
<p>  서버는 데이터를 저장하고 요청받은 것을 제공하는 역할을 한다.
그리고 브라우저는 서버에서 데이터를 받아와서 사용자의 화면에 그려주는 역할을 한다.</p>
<p>  이때 http(HyperText Transfer Protocol)라는 약속에 따라서 브라우저가 요청을 하는데 API(Application Programming Interface)라는 서버가 만들어 놓은 창구에 보낸다.</p>
<h2 id="1-2-웹-동작-개념데이터만-받을-때">1-2 웹 동작 개념(데이터만 받을 때)</h2>
<p>  서버에서 뼈대(html)를 계속 불러오는 방식도 있지만 데이터만 받아오는 방법이 있는데
JSON(JS Object Lotation)방식이 바로 그것이다.
브라우저가 미리 뼈대를 다운받아 가지고 있고, 서버에서 데이터 만을 제공받는 것이다. 즉, 껍데기만 가지고 있다가 데이터를 받아서 붙여주는 것이다.
  이 방식은 &#39;앱&#39;에서 많이 사용되는 것이라고 한다.</p>
<hr>
<h1 id="2-htmlcss">2. HTML/CSS</h1>
<h2 id="2-1-개념-및-구조">2-1 개념 및 구조</h2>
<p>HTML은 구역과 텍스트를 나타내는 코드 / 뼈대
CSS는 잡은 구역을 꾸며주는 역할 / 꾸미기
(CSS를 잘 사용하는 것과 이쁘게 만드는 것은 다른 영역이다)</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt; 
    &lt;title&gt; &lt;/title&gt;
    &lt;style&gt; &lt;/style&gt;
    &lt;script&gt; JS내용 &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><h3 id="html">HTML</h3>
<h4 id="구성">구성</h4>
<p>HTML은 크게 <code>head</code>와 <code>body</code>로 구성이 된다.
이 때 <code>head</code>는 페이지의 <code>속성</code> 정보를 담는다. <code>&lt;style&gt;</code>,<code>&lt;script&gt;</code> 등
CSS와 JS 등 적용할 수 있다.</p>
<p><code>body</code>는 본격적으로 뼈대를 만들어내는 <code>본문</code>이라고 생각하면 된다.</p>
<p>HTML은 <code>태그</code>라는 요소로 문서를 구성한다. 즉, HTML을 구성하는 기본단위이다.
그래서 텍스트, 구역 등을 태그로 표현한다.</p>
<h4 id="구역을-나누는-태그들">구역을 나누는 태그들</h4>
<p><code>div</code>: 구역 나누기
<code>p</code>: 문단
<code>ul</code>&amp;<code>ol</code>: 순서 없는&amp;있는 목록
<code>li</code>: 목록/ul과 ol 내부에 들어간다</p>
<h4 id="구역-내-콘텐츠-태그들">구역 내 콘텐츠 태그들</h4>
<p><code>h1~5</code>: 섹션, 문단의 제목 / h1은 꼭 써주는 편이 좋다.
<code>a</code>: anchor / 하이퍼링크를 걸어주는 태그
<code>img</code>: image / 이미지
그 외<code>input</code>,<code>button</code>,<code>textarea</code> 등</p>
<p>html의 태그는 정말정말 많고 아무도 모두 외우지 않는다.
자주 사용하는 것은 자연스럽게 쓸 수 있을 것이고,
필요한 기능이 있다면 찾아서 활용을 하면 된다!</p>
<h4 id="구역-안의-구역">구역 안의 구역</h4>
<p>html 태그는 &#39;내 안에 너 있다&#39;구조가 있다. 즉, 부모-자식 구조가 있는데
<img src="https://images.velog.io/images/dev_kassid/post/459ec801-e0b3-4c8d-9658-e1a1826c8e49/div_div.PNG" alt="">
위의 그림에서 A안에 B,C 태그가 있을 때 A에 속성을 부여하면 B,C에 모두 적용이 된다.
이 때 B나 C에 따로 속성을 적용을 한다면 &quot;우선 적용&quot;이 된다.</p>
<h3 id="css">CSS</h3>
<p><code>&lt;head&gt;</code>의<code>&lt;style&gt;</code>안에 작성을 하면 되고 <code>태그</code>, <code>class</code>, <code>id</code> 에 적용을 할 수 있다.
이때 적용 우선순위는 <code>id</code>&gt;<code>class</code>&gt;<code>태그</code>이다. (같은 레벨끼리는 나중에 선언 된 것이 &#39;선&#39;)
이에 따라서 <code>태그</code>선택자로 전체적으로 디자인한 후, <code>class</code>,<code>id</code>로 구체적인 것을 추가한 방식을 주로 이용한다!</p>
<h4 id="그-외">그 외)</h4>
<ul>
<li><p>배경 관련
-&gt; <code>background-color</code>, <code>background-image</code>, <code>background-size</code>, <code>background-position</code></p>
</li>
<li><p>사이즈
-&gt; <code>width</code>, <code>height</code></p>
</li>
<li><p>간격
-&gt; <code>margin</code>, <code>padding</code> : 바깥여백, 안 여백</p>
<div align='center'><img src=https://images.velog.io/images/dev_kassid/post/a1f286c1-fdbe-4e56-a7ee-4ae65c0e5dcf/image.png width=400>
</div>
위 사진을 잘 알고 있는 것이 좋다!

</li>
</ul>
<p>CSS도 HTML과 마찬가지로 정말 다양한 태그들이 있는데 역시나 외운다기보다는 필요한 것을 가져다쓰는 방식으로 활용을 해보자!</p>
<h2 id="2-2-부트스트랩bootstrap">2-2 부트스트랩(Bootstrap)</h2>
<p><code>오픈 소스 프론트엔드 프레임워크</code>이고 웬만한 웹 페이지에서 사용하는 여러 기능들이 준비가 되어있다. (버튼, 썸네일, 알림 메시지 등)
이를 이용하면 디자인에 소요하는 시간을 크게 줄일 수 있을 것이다!
link : <a href="https://getbootstrap.com/">https://getbootstrap.com/</a></p>
<p>+그외 다룬 내용들)
JS 기초 문법</p>
<hr>
<h1 id="1주차에서-만든-것들">1주차에서 만든 것들</h1>
<ol>
<li><p>팬명록 페이지</p>
<img src=https://images.velog.io/images/dev_kassid/post/8be2e3e5-d636-45f3-bb04-86b51d6cd6ee/%EB%AC%B4%EC%A0%9C.png width=500>
</li>
<li><p>나의 영화 리스트 페이지</p>
<img src=https://images.velog.io/images/dev_kassid/post/6a604076-70ac-4ff5-99f3-2fbb879769ee/%EB%AC%B4%EC%A0%9C%20(1).png width=500></li>
</ol>
]]></description>
        </item>
    </channel>
</rss>