<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>inwoo</title>
        <link>https://velog.io/</link>
        <description>@dev_inwoo</description>
        <lastBuildDate>Mon, 21 Feb 2022 11:28:26 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. inwoo. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_inuu" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[220221 웹개발종합반 - 5주차]]></title>
            <link>https://velog.io/@dev_inuu/220221-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%A2%85%ED%95%A9%EB%B0%98-5%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@dev_inuu/220221-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%A2%85%ED%95%A9%EB%B0%98-5%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Mon, 21 Feb 2022 11:28:26 GMT</pubDate>
            <description><![CDATA[<h3 id="5주차-1회독-회고">5주차 1회독 회고</h3>
<p>오늘 수업이 제일 재밌었당 ㅎ.ㅎ
얼른 2회독 빠르게 돌리자!
siro-haku.shop</p>
<hr>
<h3 id="오늘-수업에서-설치한-것">오늘 수업에서 설치한 것</h3>
<blockquote>
<p>Filezilla</p>
</blockquote>
<hr>
<h3 id="버킷리스트">버킷리스트</h3>
<h4 id="프로젝트-세팅">프로젝트 세팅</h4>
<ol>
<li>flask 폴더 구조 만들기
: static, templates 폴더, app.py 만들기</li>
<li>패키지 설치하기
: flask, pymongo, dnspython<h4 id="버킷리스트---뼈대-준비">버킷리스트 - 뼈대 준비</h4>
</li>
<li>app.py, index.html 준비</li>
<li>mongoDB Atlas 창 띄어놓기<h4 id="post-기록하기">POST (기록하기)</h4>
<blockquote>
<p>API 만들고 사용하기 - 버킷리스트 기록 API (Create -&gt; POST)</p>
</blockquote>
</li>
<li>요청정보 : URL=/bucket, 요청 방식 = POST</li>
<li>클라이언트(ajax) -&gt; 서버(flask) : bucket</li>
<li>서버(flask) -&gt; 클라이언트(ajax) : 기록 완료되었다는 메세지 전송</li>
</ol>
<ul>
<li>버킷리스트 업데이트를 위해 서버에서 번호를 만들어 함께 넣어주어야 함</li>
</ul>
<ol>
<li><p>클라이언트와 서버 연결 확인</p>
</li>
<li><p>서버 만들기 : bucket 정보를 받아서 저장 + 버킷 번호, 완료여부를 함께 넣어주어야 함</p>
<pre><code>@app.route(&quot;/bucket&quot;, methods=[&quot;POST&quot;])
def bucket_post():
 bucket_receive = request.form[&quot;bucket_give&quot;]

 count = db.bucket.find({},{&#39;_id&#39;:False}).count()
 num = count + 1

 doc = {
     &#39;num&#39;:num,
     &#39;bucket&#39;: bucket_receive,
     &#39;done&#39;:0
 }

 db.bucket.insert_one(doc)
 return jsonify({&#39;msg&#39;:&#39;등록 완료!&#39;})</code></pre></li>
<li><p>클라이언트 만들기 : bucket 정보를 보내주면 됨</p>
<pre><code>function save_bucket(){
 let bucket = $(&#39;#bucket&#39;).val()
 $.ajax({
     type: &quot;POST&quot;,
     url: &quot;/bucket&quot;,
     data: {bucket_give:bucket},
     success: function (response) {
         alert(response[&quot;msg&quot;])
         window.location.reload() #새로고침
     }
 });
}</code></pre></li>
<li><p>완성 확인하기 : DB에 num, bucket, done 잘 들어갔는지 확인</p>
</li>
</ol>
<hr>
<h4 id="get연습-보여주기">GET연습 (보여주기)</h4>
<blockquote>
<p>API 만들고 사용하기 -  버킷리스트 조회 API (Read→ GET)</p>
</blockquote>
<ol>
<li><p>요청 정보 :  URL= /bucket, 요청 방식 = GET</p>
</li>
<li><p>클라이언트(ajax) → 서버(flask) : X</p>
</li>
<li><p>서버(flask) → 클라이언트(ajax) : 전체 버킷리스트를 보여주기</p>
</li>
<li><p>클라이언트와 서버 연결 확인</p>
</li>
<li><p>서버 만들기 : 받을 것 없이 buckets에 주문정보를 담아서 내려주면 끝</p>
</li>
<li><p>클라이언트 만들기 : 응답을 잘 받아서 for문으로 붙여주면 끝</p>
</li>
<li><p>완성 확인하기 : 버킷리스트가 잘 붙었는지 확인</p>
<h4 id="post-완료하기">POST (완료하기)</h4>
<blockquote>
<p>API 만들고 사용하기 - 버킷리스트 완료 API (Update→ POST)</p>
</blockquote>
</li>
<li><p>요청 정보 :  URL= /bucket/done, 요청 방식 = POST</p>
</li>
<li><p>클라(ajax) → 서버(flask) : num (버킷 넘버)</p>
</li>
<li><p>서버(flask) → 클라(ajax) : 메시지를 보냄 (버킷 완료!)</p>
</li>
<li><p>클라이언트와 서버 연결 확인</p>
</li>
<li><p>서버 만들기 : 버킷 번호를 받아서, 업데이트
(주의 : num_receive는 문자열로 들어오기 때문에, 숫자로 바꿔줘야 함!)</p>
</li>
<li><p>클라이언트 만들기 : 버킷 넘버를 보여주면 된다.
(버킷 넘버는 HTML이 만들어질 때 적히게 된다)</p>
</li>
<li><p>완성 확인하기 : 버킷리스트 항목에 취소선 그어졌는지 확인</p>
</li>
</ol>
<hr>
<h3 id="내-프로젝트를-서버에-올리기">내 프로젝트를 서버에 올리기</h3>
<ul>
<li>웹서비스 런칭에 필요한 개념
: 웹서비스를 런칭하기 위해 클라이언트의 요청에 항상 응답해줄 수 있는 서버에 프로젝트를 실행시켜줄 건데, 언제나 요청에 응답하려면 1. 컴퓨터가 항상 켜져있고 프로그램이 실행되어 있어야 하며 2. 모두가 접근할 수 있는 공개 주소인 공개 IP 주소(Public IP Address)로 나의 웹서비스에 접근할 수 있도록 해야함
: 서버 = 컴퓨터, 외부 접속이 가능하게 설정한 다음에 내 컴퓨터를 서버로 사용할 수도 있음
: AWS라는 클라우드 서비스에서 편하게 서버를 관리하기 위해서 항상 켜 놓을 수 있는 컴퓨터인 EC2 사용권을 구입해 서버로 사용</li>
</ul>
<hr>
<h3 id="리눅스-명령어-몇-가지">리눅스 명령어 몇 가지</h3>
<p>mkdir : 내 위치 아래에 폴더를 하나 만든다.
sudo [실행 할 명령어] : 명령어를 관리자 권한으로 실행한다.
sudo su : 관리가 권한으로 들어간다.</p>
<hr>
<h3 id="서버-세팅하기">서버 세팅하기</h3>
<ol>
<li>서버 환경 통일하기</li>
<li>filezilla 이용하여 간단한 python 파일 올려보기</li>
<li>파이썬 파일 실행해보기<pre><code>python test.py</code></pre></li>
<li>서버 환경 세팅 (맥락만 이해하기)
 1) 파이썬 (python3 -&gt; python)
 : python3 명령어를 python으로 사용할 수 있게 하는 명령어
 2) pip (pip3 -&gt; pip) 
 : pip3 설치<pre><code> sudo apt-get update
 sudo apt-get install -y python3-pip</code></pre> : pip3명령어를 pip으로 사용할 수 있게 하는 명령어<pre><code> sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1</code></pre> 3) 포트포워딩 (80포트 -&gt; 5000포트)
 : 80포트로 들어오는 요청을 5000포트로 넘겨주는 명령어<pre><code> sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000</code></pre></li>
</ol>
<hr>
<h3 id="flask-서버-실행">flask 서버 실행</h3>
<ol>
<li>팬명록 완성본을 filezilla로 EC2에 업로드</li>
<li>pip로 패키지 설치 <pre><code>pip install flask</code></pre><pre><code>pip install flask</code></pre></li>
<li>다시 flask 서버 실행
<code>python app.py</code> 명령어 사용하여 flask 서버 실행 &gt; 서버 실행이 되면, 크롬에서 접속 (http://[내 EC2 IP]:5000/)</li>
<li>AWS 에서 5000포트 열어주기
: 80포트 = HTTP 접속을 위한 기본 포트/ 5000포트 = flask 기본 포트</li>
<li>포트포워딩 사용하여 포트번호 없애기 &gt; 재접속(http://내아이피)</li>
</ol>
<hr>
<h3 id="nohup-설정">nohup 설정</h3>
<ul>
<li>SSH 접속을 끊어도 서버가 계속 돌게 하기<pre><code>nohup python app.py &amp;</code></pre></li>
<li>서버 종료하기 - 강제 종료<pre><code>ps -ef | grep &#39;python app.py&#39; | awk &#39;{print $2}&#39; | xargs kill</code></pre></li>
<li>SSH 접속을 종료한 뒤, 브라우저에서 접속하기 (http://내AWS아이피/)</li>
</ul>
<hr>
<h3 id="og-태그">og 태그</h3>
<ul>
<li>og 태그 만들기<blockquote>
<p>static 폴더 아래에 이미지 파일을 넣고, 프로젝트 HTML의 <head> ~ </head> 사이에 코드를 작성</p>
</blockquote>
</li>
</ul>
<pre><code>&lt;meta property=&quot;og:title&quot; content=&quot;내 사이트의 제목&quot; /&gt;
&lt;meta property=&quot;og:description&quot; content=&quot;보고 있는 페이지의 내용 요약&quot; /&gt;
&lt;meta property=&quot;og:image&quot; content=&quot;이미지URL&quot; /&gt;</code></pre><ul>
<li>이미지 변경 후, 이전 ogimage가 그대로 나올 경우<blockquote>
<p>카카오톡에서 처음 것을 한동안 저장해놓기 때문</p>
</blockquote>
</li>
</ul>
<p>카카오톡 og 태그 초기화 : <a href="https://developers.kakao.com/tool/clear/og">https://developers.kakao.com/tool/clear/og</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[220217 웹개발종합반 - 4주차]]></title>
            <link>https://velog.io/@dev_inuu/220217-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%A2%85%ED%95%A9%EB%B0%98-4%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@dev_inuu/220217-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%A2%85%ED%95%A9%EB%B0%98-4%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Thu, 17 Feb 2022 13:31:23 GMT</pubDate>
            <description><![CDATA[<h3 id="4주차-1회독-회고">4주차 1회독 회고</h3>
<p>오늘은 HTML과 mongoDB Atlas 클라우드 서비스를 연동해서 서버를 사용해봤다! 헷갈리는 게 많았는데 예제를 반복하니까 좀 친근해졌다! 그동안 들었던 주차 중에서 제일 재밌었다 ㅎㅎ</p>
<hr>
<h3 id="로컬-개발-환경">로컬 개발 환경</h3>
<p>같은 컴퓨터에 서버도 만들고, 요청도 함!
즉, 클라이언트 = 서버</p>
<hr>
<h3 id="flask-프레임워크">Flask 프레임워크</h3>
<p>서버를 구동시켜주는 편한 코드 모음
서버를 구동하려면 필요한 복잡한 것들을 쉽게 가져다 사용할 수 있음</p>
<hr>
<h3 id="flask-시작-코드">Flask 시작 코드</h3>
<blockquote>
<p>통상적으로 flask 서버를 돌리는 파일은 app.py라고 이름을 지음</p>
</blockquote>
<pre><code>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><hr>
<h3 id="flask--url-나누기">Flask : URL 나누기</h3>
<blockquote>
<p>url 별로 함수명이 같거나, route(&#39;/&#39;)내의 주소가 같으면 안 됨</p>
</blockquote>
<pre><code>from flask import Flask
app = Flask(__name__)

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

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

if __name__ == &#39;__main__&#39;:  
   app.run(&#39;0.0.0.0&#39;,port=5000,debug=True)</code></pre><hr>
<h3 id="flask--html-파일-불러오기">Flask : HTML 파일 불러오기</h3>
<blockquote>
<p>Flask 서버를 만들 때 기본 폴더 구조
프로젝트 폴더 안에 
ㄴ static 폴더 (이미지, css 파일)
ㄴ templates 폴더 (html 파일)
ㄴ app.py 파일</p>
</blockquote>
<p>flask 내장함수 render_template를 사용함</p>
<pre><code>from flask import Flask, render_template
app = Flask(__name__)

## URL 별로 함수명이 같거나,
## route(&#39;/&#39;) 등의 주소가 같으면 안됩니다.

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

if __name__ == &#39;__main__&#39;:
   app.run(&#39;0.0.0.0&#39;, port=5000, debug=True)</code></pre><hr>
<h3 id="flask--api-만들기">Flask : API 만들기</h3>
<blockquote>
<p>GET, POST 방식 복습</p>
</blockquote>
<ol>
<li>GET
: 데이터 조회(Read) 요청 시 사용
: 데이터 전달 시, URL 뒤에 물음표를 붙여 key=value로 전달 (예 : google.com?q=북극곰)</li>
<li>POST
: 데이터 생성, 변경, 삭제 요청 시 사용
: 데이터 전달 시, 바로 보이지 않는 HTML body에 key:value 형태로 전달</li>
</ol>
<p>&lt; <em>GET, POST 요청에서 클라이언트의 데이터를 받는 방법</em> &gt;</p>
<blockquote>
<p>예) 클라이언트에서 서버에 title_give란 키 값으로 데이터를 들고왔을 때</p>
</blockquote>
<ul>
<li><p>GET 요청 API 코드</p>
<pre><code>@app.route(&#39;/test&#39;, methods=[&#39;GET&#39;])
def test_get():
 title_receive = request.args.get(&#39;title_give&#39;)
 print(title_receive)
 return jsonify({&#39;result&#39;:&#39;success&#39;, &#39;msg&#39;: &#39;이 요청은 GET!&#39;})</code></pre></li>
<li><p>GET 요청 확인 Ajax코드</p>
<pre><code>$.ajax({
  type: &quot;GET&quot;,
  url: &quot;/test?title_give=봄날은간다&quot;,
  data: {},
  success: function(response){
     console.log(response)
  }
})</code></pre></li>
<li><p>POST 요청 API코드</p>
<pre><code>@app.route(&#39;/test&#39;, methods=[&#39;POST&#39;])
def test_post():
 title_receive = request.form[&#39;title_give&#39;]
 print(title_receive)
 return jsonify({&#39;result&#39;:&#39;success&#39;, &#39;msg&#39;: &#39;이 요청은 POST!&#39;})</code></pre></li>
<li><p>POST 요청 확인 Ajax코드</p>
<pre><code>$.ajax({
  type: &quot;POST&quot;,
  url: &quot;/test&quot;,
  data: { title_give:&#39;봄날은간다&#39; },
  success: function(response){
     console.log(response)
  }
})</code></pre></li>
</ul>
<hr>
<h3 id="프로젝트-세팅">프로젝트 세팅</h3>
<blockquote>
<p>패키지 설치 : flask, pymongo, dnspython (bs4, requests)</p>
</blockquote>
<ol>
<li>app.py 준비</li>
<li>index.html 준비</li>
<li>mongoDB Atlas 창 띄워두기</li>
</ol>
<hr>
<h3 id="post-연습-주문-저장">POST 연습 (주문 저장)</h3>
<h4 id="api-만들고-사용하기---이름-주소-평수-저장하기-create---post">API 만들고 사용하기 - 이름, 주소, 평수 저장하기 (Create -&gt; POST)</h4>
<blockquote>
<ol>
<li>요청정보 = URL(/mars), 요청 방식 = POST</li>
<li>클라이언트(ajaxk) -&gt; 서버(flask) : name, address, size</li>
<li>서버(flask) -&gt; 클라이언트(ajax) : &#39;주문 완료!&#39; 메세지를 보냄</li>
</ol>
</blockquote>
<p>1) 클라이언트와 서버 연결 확인
[서버 코드 : app.py]</p>
<pre><code>@app.route(&quot;/mars&quot;, methods=[&quot;POST&quot;])
def mars_post():
    sample_receive = request.form[&#39;sample_give&#39;]
    print(sample_receive)
    return jsonify({&#39;msg&#39;: &#39;POST 연결 완료!&#39;})</code></pre><p>[클라이언트 코드 : index.html]</p>
<pre><code class="language-jsx">function save_order() {
    $.ajax({
        type: &#39;POST&#39;,
        url: &#39;/mars&#39;,
        data: { sample_give:&#39;데이터전송&#39; },
        success: function (response) {
            alert(response[&#39;msg&#39;])
        }
    });
}

&lt;button onclick=&quot;save_order()&quot; type=&quot;button&quot; class=&quot;btn btn-warning mybtn&quot;&gt;주문하기&lt;/button&gt;</code></pre>
<p>2) 서버 만들기</p>
<blockquote>
<p>name, address, size 정보를 받아 저장</p>
</blockquote>
<pre><code>@app.route(&quot;/mars&quot;, methods=[&quot;POST&quot;])
def mars_post():
    name_receive = request.form[&#39;name_give&#39;]
    address_receive = request.form[&#39;address_give&#39;]
    size_receive = request.form[&#39;size_give&#39;]

    doc = {
        &#39;name&#39;: name_receive,
        &#39;address&#39;: address_receive,
        &#39;size&#39;: size_receive
    }

    db.orders.insert_one(doc)

    return jsonify({&#39;msg&#39;: &#39;주문 완료!&#39;})</code></pre><p>3) 클라이언트 만들기</p>
<blockquote>
<p>name, address, size 정보를 보냄</p>
</blockquote>
<pre><code>function save_order() {
    let name = $(&#39;#name&#39;).val()
    let address = $(&#39;#address&#39;).val()
    let size = $(&#39;#size&#39;).val()

    $.ajax({
        type: &#39;POST&#39;,
        url: &#39;/mars&#39;,
        data: { name_give:name, address_give:address, size_give:size },
        success: function (response) {
            alert(response[&#39;msg&#39;])
            window.location.reload()
        }
    });
}</code></pre><p>4) 완성 확인 (DB에 잘들어갔는지 확인)</p>
<hr>
<h3 id="get-연습주문-보여주기">GET 연습(주문 보여주기)</h3>
<h4 id="api-만들고-사용하기---저장된-주문을-화면에-보여주기read-→-get">API 만들고 사용하기 - 저장된 주문을 화면에 보여주기(Read → GET)</h4>
<blockquote>
<p>요청정보 = URL(/mars), 요청 방식 = GET
클라이언트(ajaxk) -&gt; 서버(flask) : 없음
서버(flask) -&gt; 클라이언트(ajax) : 전체 주문을 보내주기</p>
</blockquote>
<p>1) 클라이언트와 서버 확인
[서버 코드 : app.py]</p>
<pre><code>@app.route(&quot;/mars&quot;, methods=[&quot;GET&quot;])
def mars_get():
    return jsonify({&#39;msg&#39;: &#39;GET 연결 완료!&#39;})</code></pre><p>[클라이언트 코드 : index.html]</p>
<pre><code>$(document).ready(function () {
    show_order();
});
function show_order() {
    $.ajax({
        type: &#39;GET&#39;,
        url: &#39;/mars&#39;,
        data: {},
        success: function (response) {
            alert(response[&#39;msg&#39;])
        }
    });
}</code></pre><p>2) 서버 만들기</p>
<blockquote>
<p>받을 것 없이 order에 주문 정보를 담아서 내려주기</p>
</blockquote>
<pre><code>@app.route(&quot;/mars&quot;, methods=[&quot;GET&quot;])
def mars_get():
    orders_list = list(db.orders.find({},{&#39;_id&#39;:False}))
    return jsonify({&#39;orders&#39;:orders_list})</code></pre><p>3) 클라이언트 만들기</p>
<blockquote>
<p>응답을 잘 받아서 for문으로 붙여주기</p>
</blockquote>
<pre><code>function show_order() {
    $(&#39;#order-box&#39;).empty()
    $.ajax({
        type: &#39;GET&#39;,
        url: &#39;/mars&#39;,
        data: {},
        success: function (response) {
            let rows = response[&#39;orders&#39;]
            for (let i = 0; i &lt; rows.length; i++) {
                let name = rows[i][&#39;name&#39;]
                let address = rows[i][&#39;address&#39;]
                let size = rows[i][&#39;size&#39;]

                let temp_html = `&lt;tr&gt;
                                    &lt;td&gt;${name}&lt;/td&gt;
                                    &lt;td&gt;${address}&lt;/td&gt;
                                    &lt;td&gt;${size}&lt;/td&gt;
                                  &lt;/tr&gt;`
                $(&#39;#order-box&#39;).append(temp_html)
            }

        }
    });
}</code></pre><p>4) 완성 확인
화면 새로고침 시, DB에 저장된 리뷰가 화면에 표시되는지 확인</p>
<hr>
<h3 id="조각-기능-구현">조각 기능 구현</h3>
<blockquote>
<p>API에서 수행해야하는 작업 중 익숙하지 않은 것들은 따로 파이썬 파일을 만들어 실행해보고 잘 되었을 때 코드를 붙여넣을 것</p>
</blockquote>
<h4 id="meta-태그-스크래핑-url-에서-페이지-정보제목-썸네일-이미지-내용-가져오기">meta 태그 스크래핑 (URL 에서 페이지 정보(제목, 썸네일 이미지, 내용) 가져오기)</h4>
<p>: 메타 태그 = <code>&lt;head&gt;&lt;/head&gt;</code> 부분에 들어가며, 눈으로 보이는 <code>body</code>외에 사이트의 속성을 설명해주는 태그 (예 : 구글 검색 시 표시될 설명문, 사이트 제목, 카톡 공유 시 표시될 이미지)
<em><strong>크롤링 기본 코드</strong></em></p>
<pre><code>import requests
from bs4 import BeautifulSoup

url = &#39;https://movie.naver.com/movie/bi/mi/basic.naver?code=191597&#39;

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(url,headers=headers)

soup = BeautifulSoup(data.text, &#39;html.parser&#39;)</code></pre><p><em><strong>select_one을 이용해 meta tag를 먼저 가져온다.</strong></em></p>
<pre><code>og_image = soup.select_one(&#39;meta[property=&quot;og:image&quot;]&#39;)
og_title = soup.select_one(&#39;meta[property=&quot;og:title&quot;]&#39;)
og_description = soup.select_one(&#39;meta[property=&quot;og:description&quot;]&#39;)

print(og_image)
print(og_title)
print(og_description)</code></pre><p><em><strong>가져온 meta tag의 content를 가져온다.</strong></em></p>
<pre><code>image = og_image[&#39;content&#39;]
title = og_title[&#39;content&#39;]
description = og_description[&#39;content&#39;]

print(image)
print(title)
print(description)</code></pre><hr>
<h3 id="4주차-숙제">4주차 숙제</h3>
<p><em>comment랑 comments를 헷갈려서 엄청 헤맸당,,</em></p>
<h4 id="apppy">app.py</h4>
<pre><code>from flask import Flask, render_template, request, jsonify
app = Flask(__name__)

from pymongo import MongoClient
client = MongoClient(&#39;mongodb+srv://test:sparta@cluster0.o5gjy.mongodb.net/Cluster0?retryWrites=true&amp;w=majority&#39;)
db = client.dbsparta

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

@app.route(&quot;/homework&quot;, methods=[&quot;POST&quot;])
def homework_post():
    name_receive = request.form[&#39;name_give&#39;]
    comment_receive = request.form[&#39;comment_give&#39;]

    doc = {
        &#39;name&#39;:name_receive,
        &#39;comment&#39;:comment_receive
    }

    db.homework.insert_one(doc)

    return jsonify({&#39;msg&#39;:&#39;응원 메세지 등록 완료!&#39;})

@app.route(&quot;/homework&quot;, methods=[&quot;GET&quot;])
def homework_get():
    comment_list = list(db.homework.find({},{&#39;_id&#39;:False}))
    return jsonify({&#39;comments&#39;:comment_list})

if __name__ == &#39;__main__&#39;:
   app.run(&#39;0.0.0.0&#39;, port=5000, debug=True)</code></pre><h4 id="indexhtml">index.html</h4>
<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;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;

    &lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;
        integrity=&quot;sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC&quot; crossorigin=&quot;anonymous&quot;&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 src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js&quot;
        integrity=&quot;sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM&quot;
        crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;

    &lt;title&gt;초미니홈피 - 팬명록&lt;/title&gt;

    &lt;link href=&quot;https://fonts.googleapis.com/css2?family=Noto+Serif+KR:wght@200;300;400;500;600;700;900&amp;display=swap&quot; rel=&quot;stylesheet&quot;&gt;
    &lt;style&gt;
        * {
            font-family: &#39;Noto Serif KR&#39;, serif;
        }
        .mypic {
            width: 100%;
            height: 300px;

            background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url(&#39;https://t1.daumcdn.net/cfile/tistory/99F3D3435C8F7C6901?original&#39;);
            background-position: center 30%;
            background-size: cover;

            color: white;

            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
        }

        .mypost {
            width: 95%;
            max-width: 500px;
            margin: 20px auto 20px auto;

            box-shadow: 0px 0px 3px 0px black;
            padding: 20px;
        }

        .mypost &gt; button {
            margin-top: 15px;
        }

        .mycards {
            width: 95%;
            max-width: 500px;
            margin: auto;
        }

        .mycards &gt; .card {
            margin-top: 10px;
            margin-bottom: 10px;
        }
    &lt;/style&gt;
    &lt;script&gt;
        $(document).ready(function(){
            set_temp()
            show_comment()
        });
        function set_temp(){
            $.ajax({
                type: &quot;GET&quot;,
                url: &quot;http://spartacodingclub.shop/sparta_api/weather/seoul&quot;,
                data: {},
                success: function (response) {
                    $(&#39;#temp&#39;).text(response[&#39;temp&#39;])
                }
            })
        }
        function save_comment(){
            let name = $(&#39;#name&#39;).val()
            let comment = $(&#39;#comment&#39;).val()

            $.ajax({
                type: &#39;POST&#39;,
                url: &#39;/homework&#39;,
                data: {name_give:name, comment_give:comment},
                success: function (response) {
                    alert(response[&#39;msg&#39;])
                    window.location.reload()
                }
            })
        }
        function show_comment(){
            $(&#39;#comment-list&#39;).empty()
            $.ajax({
                type: &quot;GET&quot;,
                url: &quot;/homework&quot;,
                data: {},
                success: function (response) {
                    let rows = response[&#39;comments&#39;]
                    for(let i = 0; i &lt; rows.length; i++){
                        let name = rows[i][&#39;name&#39;]
                        let comment = rows[i][&#39;comment&#39;]

                        let temp_html = `&lt;div class=&quot;card&quot;&gt;
                                            &lt;div class=&quot;card-body&quot;&gt;
                                                &lt;blockquote class=&quot;blockquote mb-0&quot;&gt;
                                                    &lt;p&gt;${comment}&lt;/p&gt;
                                                    &lt;footer class=&quot;blockquote-footer&quot;&gt;${name}&lt;/footer&gt;
                                                &lt;/blockquote&gt;
                                            &lt;/div&gt;
                                        &lt;/div&gt;`
                        $(&#39;#comment-list&#39;).append(temp_html)
                    }
                }
            });
        }
    &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div class=&quot;mypic&quot;&gt;
        &lt;h1&gt;백예린 팬명록&lt;/h1&gt;
        &lt;p&gt;현재기온: &lt;span id=&quot;temp&quot;&gt;36&lt;/span&gt;도&lt;/p&gt;
    &lt;/div&gt;
    &lt;div class=&quot;mypost&quot;&gt;
        &lt;div class=&quot;form-floating mb-3&quot;&gt;
            &lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;name&quot; placeholder=&quot;url&quot;&gt;
            &lt;label for=&quot;floatingInput&quot;&gt;닉네임&lt;/label&gt;
        &lt;/div&gt;
        &lt;div class=&quot;form-floating&quot;&gt;
            &lt;textarea class=&quot;form-control&quot; placeholder=&quot;Leave a comment here&quot; id=&quot;comment&quot;
                style=&quot;height: 100px&quot;&gt;&lt;/textarea&gt;
            &lt;label for=&quot;floatingTextarea2&quot;&gt;응원댓글&lt;/label&gt;
        &lt;/div&gt;
        &lt;button onclick=&quot;save_comment()&quot; type=&quot;button&quot; class=&quot;btn btn-dark&quot;&gt;응원 남기기&lt;/button&gt;
    &lt;/div&gt;
    &lt;div class=&quot;mycards&quot; id=&quot;comment-list&quot;&gt;

    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[220215 웹개발종합반 - 3주차]]></title>
            <link>https://velog.io/@dev_inuu/220215-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%A2%85%ED%95%A9%EB%B0%98-3%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@dev_inuu/220215-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%A2%85%ED%95%A9%EB%B0%98-3%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Tue, 15 Feb 2022 13:40:49 GMT</pubDate>
            <description><![CDATA[<h2 id="3주차-1회독-회고">3주차 1회독 회고</h2>
<p>오늘 수업은 2주차 보다 훨씬 괜찮았지만
파이썬의 반복문이 많이 낯설었고, 웹스크래핑 할 때 뭔가 옵션이 붙는다던지
불러올 친구들을 지정해야하는 게 쉽지않았던 것 같당,,,
이번주에 무조건 5주차 1회독 하고, 담주 2회독까지 열심히 해야겠당!</p>
<hr>
<h2 id="python">Python</h2>
<h3 id="python-기본-문법">Python 기본 문법</h3>
<ul>
<li>자료형 - 리스트 형<pre><code>a_list.append(1) # 리스트에 값을 넣는다.
a_list.append([2,3]) # 리스트에 [2,3]이라는 리스트를 다시 넣는다.
</code></pre></li>
</ul>
<h1 id="a_list의-값은-123">a_list의 값은? [1,[2,3]]</h1>
<h1 id="a_list0의-값은-1">a_list[0]의 값은? 1</h1>
<h1 id="a_list1의-값은-23">a_list[1]의 값은? [2,3]</h1>
<h1 id="a_list10의-값은-2">a_list[1][0]의 값은? 2</h1>
<pre><code>* 자료형 - Dictionary 형</code></pre><p>a_dict = {}
a_dict = {&#39;name&#39;:&#39;bob&#39;,&#39;age&#39;:21}
a_dict[&#39;height&#39;] = 178</p>
<h1 id="a_dict의-값은-namebobage21-height178">a_dict의 값은? {&#39;name&#39;:&#39;bob&#39;,&#39;age&#39;:21, &#39;height&#39;:178}</h1>
<h1 id="a_dictname의-값은-bob">a_dict[&#39;name&#39;]의 값은? &#39;bob&#39;</h1>
<h1 id="a_dictage의-값은-21">a_dict[&#39;age&#39;]의 값은? 21</h1>
<h1 id="a_dictheight의-값은-178">a_dict[&#39;height&#39;]의 값은? 178</h1>
<pre><code>* 반복문</code></pre><p>fruits = [&#39;사과&#39;,&#39;배&#39;,&#39;감&#39;,&#39;귤&#39;]</p>
<p>for fruit in fruits:
    print(fruit)</p>
<h1 id="사과-배-감-귤-하나씩-꺼내어-찍힙니다">사과, 배, 감, 귤 하나씩 꺼내어 찍힙니다.</h1>
<pre><code>* 반복문 - 리스트 예제</code></pre><p>def count_fruits(target):
    count = 0
    for fruit in fruits:
        if fruit == target:
            count += 1
    return count</p>
<p>subak_count = count_fruits(&#39;수박&#39;)
print(subak_count) #수박의 갯수</p>
<p>gam_count = count_fruits(&#39;감&#39;)
print(gam_count) #감의 갯수</p>
<pre><code>* 반복문 - 딕셔너리 예제</code></pre><p>people = [{&#39;name&#39;: &#39;bob&#39;, &#39;age&#39;: 20}, 
          {&#39;name&#39;: &#39;carry&#39;, &#39;age&#39;: 38},
          {&#39;name&#39;: &#39;john&#39;, &#39;age&#39;: 7},
          {&#39;name&#39;: &#39;smith&#39;, &#39;age&#39;: 17},
          {&#39;name&#39;: &#39;ben&#39;, &#39;age&#39;: 27}]</p>
<h1 id="모든-사람의-이름과-나이를-출력해봅시다">모든 사람의 이름과 나이를 출력해봅시다.</h1>
<p>for person in people:
    print(person[&#39;name&#39;], person[&#39;age&#39;])</p>
<h1 id="이번엔-반복문과-조건문을-응용한-함수를-만들어봅시다">이번엔, 반복문과 조건문을 응용한 함수를 만들어봅시다.</h1>
<h1 id="이름을-받으면-age를-리턴해주는-함수">이름을 받으면, age를 리턴해주는 함수</h1>
<p>def get_age(myname):
    for person in people:
        if person[&#39;name&#39;] == myname:
            return person[&#39;age&#39;]
    return &#39;해당하는 이름이 없습니다&#39;</p>
<p>print(get_age(&#39;bob&#39;))
print(get_age(&#39;kay&#39;))</p>
<pre><code>---
## 웹스크래핑(크롤링)
### select/ select_one 사용법
&gt;태그 안의 텍스트를 찍고 싶을 경우 -&gt; 태그.text
태그 안의 속성을 찍고 싶을 경우 -&gt; 태그[&#39;속성&#39;]
</code></pre><p>import requests
from bs4 import BeautifulSoup</p>
<h1 id="url을-읽어서-html를-받아오고">URL을 읽어서 HTML를 받아오고,</h1>
<p>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;<a href="https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&amp;date=20210829&#39;,headers=headers">https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&amp;date=20210829&#39;,headers=headers</a>)</p>
<h1 id="html을-beautifulsoup이라는-라이브러리를-활용해-검색하기-용이한-상태로-만듦">HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦</h1>
<p>soup = BeautifulSoup(data.text, &#39;html.parser&#39;)</p>
<h1 id="select를-이용해서-tr들을-불러오기">select를 이용해서, tr들을 불러오기</h1>
<p>movies = soup.select(&#39;#old_content &gt; table &gt; tbody &gt; tr&#39;)</p>
<h1 id="movies-tr들-의-반복문을-돌리기">movies (tr들) 의 반복문을 돌리기</h1>
<p>for movie in movies:
    # movie 안에 a 가 있으면,
    a_tag = movie.select_one(&#39;td.title &gt; div &gt; a&#39;)
    if a_tag is not None:
        # a의 text를 찍어본다.
        print (a_tag.text)</p>
<pre><code>### beautifulsoup 내 select 참고</code></pre><h1 id="선택자를-사용하는-방법-copy-selector">선택자를 사용하는 방법 (copy selector)</h1>
<p>soup.select(&#39;태그명&#39;)
soup.select(&#39;.클래스명&#39;)
soup.select(&#39;#아이디명&#39;)</p>
<p>soup.select(&#39;상위태그명 &gt; 하위태그명 &gt; 하위태그명&#39;)
soup.select(&#39;상위태그명.클래스명 &gt; 하위태그명.클래스명&#39;)</p>
<h1 id="태그와-속성값으로-찾는-방법">태그와 속성값으로 찾는 방법</h1>
<p>soup.select(&#39;태그명[속성=&quot;값&quot;]&#39;)</p>
<h1 id="한-개만-가져오고-싶은-경우">한 개만 가져오고 싶은 경우</h1>
<p>soup.select_one(&#39;위와 동일&#39;)</p>
<pre><code>---
## DB의 두가지 종류
&gt;RDBMS(SQL) : 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사
No-SQL : 딕셔너리 형태로 데이터를 저장해두는 DB

---
## pymongo로 DB 조작하기
#### 1) DB연결하기 &amp; 데이터 넣기</code></pre><h1 id="users라는-collection에-namebobbyage21를-넣습니다">&#39;users&#39;라는 collection에 {&#39;name&#39;:&#39;bobby&#39;,&#39;age&#39;:21}를 넣습니다.</h1>
<p>db.users.insert_one({&#39;name&#39;:&#39;bobby&#39;,&#39;age&#39;:21})
db.users.insert_one({&#39;name&#39;:&#39;kay&#39;,&#39;age&#39;:27})
db.users.insert_one({&#39;name&#39;:&#39;john&#39;,&#39;age&#39;:30})</p>
<pre><code>#### 2) 모든 결과 값 보기</code></pre><h1 id="모든-데이터-뽑아보기_id-값은-제외하고-출력">모든 데이터 뽑아보기(_id 값은 제외하고 출력)</h1>
<p>all_users = list(db.users.find({},{&#39;_id&#39;:False}))</p>
<p>print(all_users[0])         # 0번째 결과값을 보기
print(all_users[0][&#39;name&#39;]) # 0번째 결과값의 &#39;name&#39;을 보기</p>
<p>for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
    print(user)</p>
<pre><code>#### 3) 특정 결과 값을 뽑아 보기</code></pre><p>user = db.users.find_one({&#39;name&#39;:&#39;bobby&#39;})
print(user)</p>
<pre><code>#### 4) 수정하기</code></pre><p>db.users.update_one({&#39;name&#39;:&#39;bobby&#39;},{&#39;$set&#39;:{&#39;age&#39;:19}})</p>
<p>user = db.users.find_one({&#39;name&#39;:&#39;bobby&#39;})
print(user)</p>
<pre><code>#### 5) 삭제하기</code></pre><p>db.users.delete_one({&#39;name&#39;:&#39;bobby&#39;})</p>
<p>user = db.users.find_one({&#39;name&#39;:&#39;bobby&#39;})
print(user)</p>
<pre><code>---
## 웹스크래핑 결과 저장
&gt;도큐먼트 만들어서 하나씩 insert 할 것
</code></pre><p>import requests
from bs4 import BeautifulSoup</p>
<p>from pymongo import MongoClient
client = MongoClient(&#39;mongodb+srv://test:<a href="mailto:sparta@cluster0.55vah.mongodb.net">sparta@cluster0.55vah.mongodb.net</a>/Cluster0?retryWrites=true&amp;w=majority&#39;)
db = client.dbsparta</p>
<h1 id="url을-읽어서-html를-받아오고-1">URL을 읽어서 HTML를 받아오고,</h1>
<p>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;<a href="https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&amp;date=20210829&#39;,headers=headers">https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&amp;date=20210829&#39;,headers=headers</a>)</p>
<h1 id="html을-beautifulsoup이라는-라이브러리를-활용해-검색하기-용이한-상태로-만듦-1">HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦</h1>
<p>soup = BeautifulSoup(data.text, &#39;html.parser&#39;)</p>
<h1 id="select를-이용해서-tr들을-불러오기-1">select를 이용해서, tr들을 불러오기</h1>
<p>movies = soup.select(&#39;#old_content &gt; table &gt; tbody &gt; tr&#39;)</p>
<h1 id="movies-tr들-의-반복문을-돌리기-1">movies (tr들) 의 반복문을 돌리기</h1>
<p>for movie in movies:
    # movie 안에 a 가 있으면,
    a_tag = movie.select_one(&#39;td.title &gt; div &gt; a&#39;)
    if a_tag is not None:
        rank = movie.select_one(&#39;td:nth-child(1) &gt; img&#39;)[&#39;alt&#39;] # img 태그의 alt 속성값을 가져오기
        title = a_tag.text                                      # a 태그 사이의 텍스트를 가져오기
        star = movie.select_one(&#39;td.point&#39;).text                # td 태그 사이의 텍스트를 가져오기
        doc = {
            &#39;rank&#39;: rank,
            &#39;title&#39;: title,
            &#39;star&#39;: star
        }
        db.movies.insert_one(doc)</p>
<pre><code>---
## 웹스크래핑 퀴즈
#### &#39;가버나움&#39;의 평점과 같은 평점의 영화 제목들을 가져오기</code></pre><p>target_movie = db.movies.find_one({&#39;title&#39;:&#39;가버나움&#39;})
target_star = target_movie[&#39;star&#39;]</p>
<p>movies = list(db.movies.find({&#39;star&#39;:target_star}))</p>
<p>for movie in movies:
    print(movie[&#39;title&#39;])</p>
<pre><code>---
## 숙제 참고했던 친구들
&gt; text[0:2] : 앞에서 두글자만 끊기
strip() : 양 옆 공백 제거
</code></pre><p>import requests
from bs4 import BeautifulSoup</p>
<p>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;<a href="https://www.genie.co.kr/chart/top200?ditc=M&amp;rtm=N&amp;ymd=20210701&#39;,headers=headers">https://www.genie.co.kr/chart/top200?ditc=M&amp;rtm=N&amp;ymd=20210701&#39;,headers=headers</a>)</p>
<p>soup = BeautifulSoup(data.text, &#39;html.parser&#39;)</p>
<p>trs = soup.select(&#39;#body-content &gt; div.newest-list &gt; div &gt; table &gt; tbody &gt; tr&#39;)</p>
<p>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].strip()
    artist = tr.select_one(&#39;td.info &gt; a.artist.ellipsis&#39;).text
    print(rank, title, artist)
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[220214_웹개발 종합반 - 2주차]]></title>
            <link>https://velog.io/@dev_inuu/220214%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-2%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@dev_inuu/220214%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-2%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Mon, 14 Feb 2022 10:52:38 GMT</pubDate>
            <description><![CDATA[<h2 id="2주차-1회독-회고">2주차 1회독 회고</h2>
<p>오늘 배운 것 : HTML 파일을 받았다는 가정하에, JavaScript로 서버에 데이터를 요청하고 받는 방법/ jQuery를 이용해 JavaScript로 HTML을 쉽게 제어하고, Ajax를 이용해 다시 서버에 데이터를 요청하고 받아보았다!
2주차 수업들어봤는데 익숙하지 않아서 잘 못했던 느낌. 뭔가 계속 돌리고 있긴 한데 처음 접하는 느낌이었고 쉽지 않았다.. 이번주에 5주차 수업까지 1회독 하고 다음주에 2회독 예정,, 얼른 복습하자잉!</p>
<hr>
<h2 id="javascript-문법">Javascript 문법</h2>
<p>.includes(&#39;&#39;) : 괄호안의 문자열이 있으면 True, 없으면 False를 return.
.empty(): 내부 태그를 모두 비운다.</p>
<hr>
<h2 id="jquery">jQuery</h2>
<h3 id="자주쓰는-jquery">자주쓰는 jQuery</h3>
<blockquote>
<p>버튼의 색깔을 바꾼다던가, div 박스를 하나 감추고 싶을 때! 이런 것들을 쉽게 해주는 것
JavaScript와 다른 소프트웨어가 아니라 미리 작성된 JavaScript 코드
사용하기 전에 임포트가 필요(<head>와 </head> 사이에 임포트)
HTML의 요소들을 조작하는, 편리한 JacaScript를 미리 작성해둔 것 -&gt; 라이브러리
복잡한 코드, 브라우저간의 호환성을 극복
$ : 제이쿼리의 시작</p>
</blockquote>
<ul>
<li>CSS와 마찬가지로, 가리켜야 조작을 할 수 있는데 CSS 선택자 = class 이지만, 
jQuery는 id 값을 사용한다.<h4 id="1-input-박스의-값-가져오기">1. input 박스의 값 가져오기</h4>
<pre><code>&lt;div class=&quot;form-floating mb-3&quot;&gt;
  &lt;input id=&quot;url&quot; type=&quot;email&quot; class=&quot;form-control&quot; placeholder=&quot;name@example.com&quot;&gt;
  &lt;label&gt;영화URL&lt;/label&gt;
&lt;/div&gt;</code></pre><pre><code>// 크롬 개발자도구 콘솔창에서 쳐보기
// id 값이 url인 곳을 가리키고, val()로 값을 가져온다.
$(&#39;#url&#39;).val();
</code></pre></li>
</ul>
<p>// 입력할때는?
$(&#39;#url&#39;).val(&#39;이렇게 하면 입력이 가능&#39;);</p>
<pre><code>#### 2. div 보이기/ 숨기기
: id 값을 가리킨 후 .hide()/ .show() 사용</code></pre><p>// id 값은 post-box
$(&#39;#post-box&#39;).hide();
$(&#39;#post-box&#39;).show();</p>
<pre><code>#### 3. 태그 내 html 입력하기
: &lt;div&gt; ~ &lt;/div&gt; 내에, 동적으로 html을 넣고 싶을 때 (예 : 포스팅 되면 카드 추가) 카드가 붙는 div에 id를 추가해주어야 함</code></pre><div class="mycards">
    <div class="row row-cols-1 row-cols-md-4 g-4" id="cards-box">
        <div class="col">
            <div class="card h-100">
                <img src="https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg"
                     class="card-img-top" alt="...">
                <div class="card-body">
                    <h5 class="card-title">영화 제목이 들어갑니다</h5>
                    <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
                    <p>⭐⭐⭐</p>
                    <p class="mycomment">나의 한줄 평을 씁니다</p>
                </div>
            </div>
        </div>
    </div>
</div>
```
#### 3-1. 버튼을 넣어보자!
```
// id 값은 cards-box
// .append : 선택된 요소의 마지막에 새로운 요소나 콘텐츠를 추가
// temp_html : let 으로 내용을 정의 (html코드를 텍스트로 넣을 때 따옴표가 아닌, 백틱 사용)
// 이걸 html로 바꾸려면, $(‘#cards-box’).append(temp_html) 사용

<p>let temp_html = <code>&lt;button&gt;나는 추가될 버튼이다!&lt;/button&gt;</code>;
$(&#39;#cards-box&#39;).append(temp_html);</p>
<pre><code>#### 3-2. 카드를 넣어보자!
</code></pre><p>// backtick을 사용하면 문자 중간에 Javascript 변수를 삽입할 수 있음
let title = &#39;영화 제목이 들어갑니다&#39;;</p>
<p>let temp_html = <code>&lt;div class=&quot;col&quot;&gt;
                            &lt;div class=&quot;card h-100&quot;&gt;
                                &lt;img src=&quot;https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg&quot;
                                     class=&quot;card-img-top&quot; alt=&quot;...&quot;&gt;
                                &lt;div class=&quot;card-body&quot;&gt;
                                    &lt;h5 class=&quot;card-title&quot;&gt;${title}&lt;/h5&gt;
                                    &lt;p class=&quot;card-text&quot;&gt;여기에 영화에 대한 설명이 들어갑니다.&lt;/p&gt;
                                    &lt;p&gt;⭐⭐⭐&lt;/p&gt;
                                    &lt;p class=&quot;mycomment&quot;&gt;나의 한줄 평을 씁니다&lt;/p&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;
                        &lt;/div&gt;</code>;
$(&#39;#cards-box&#39;).append(temp_html);</p>
<pre><code>---
### jQuery 적용 (포스팅 박스)
#### 포스팅 박스 제어</code></pre><p>function open_box(){
    $(&#39;#post-box&#39;).show()
}
function close_box(){
    $(&#39;#post-box&#39;).hide()
}</p>
<pre><code>* post-box를 시작부터 감춰두기 
: CSS의 display : none 속성
---
## jQuery 퀴즈에서 몰랐던 친구들
#### 1. input-q1 입력값 가져오기</code></pre><p>let email = $(&#39;#input-q2&#39;).val();</p>
<pre><code>#### 2. 가져온 값에 @가 있으면 info@gmail.com 에서 gamil만 추출한 후, alert(도메인 값); 으로 띄우기</code></pre><p>if (email.includes(&#39;@&#39;)){
    let domainWithDot = email.split(&#39;@&#39;)[1];
    let onlyDomain = domainWithDot.split(&#39;.&#39;)[0];
    alert(onlyDomain);
}</p>
<pre><code>#### 난 이렇게 써보았당</code></pre><p>if(email.includes(&#39;@&#39;) == true){
    alert(email.split(&#39;@&#39;)[1].split(&#39;.&#39;[0]);</p>
<pre><code>#### 3. HTML 붙이기/ 지우기 연습
3-1. 이름을 입력하면 아래 나오게 하기
3-2. 다 지우기 버튼 만들기</code></pre><p>function q3() {
    // 1. input-q3 값을 가져온다.
    let newName = $(&#39;#input-q3&#39;).val();
    if (newName == &#39;&#39;) {
        alert(&#39;이름을 입력하세요&#39;);
        return;
}
    // 2. 가져온 값을 이용해 names-q3에 붙일 태그를 만든다. (let temp_html = <code>&lt;li&gt;${가져온 값}&lt;/li&gt;</code>)
    let temp_html = <code>&lt;li&gt;${newName}&lt;/li&gt;</code>;
    // 3. 만들어둔 temp_html을 names-q3에 붙인다.(jQuery의 $(&#39;...&#39;).append(temp_html)을 이용하면 굿!)
    $(&#39;#names-q3&#39;).append(temp_html);
}</p>
<pre><code>function q3_remove() {</code></pre><p>// 1. names-q3의 내부 태그를 모두 비운다.(jQuery의 $(&#39;....&#39;).empty()를 이용)
    $(&#39;#names-q3&#39;).empty();
}</p>
<pre><code>---
## 서버-클라이언트
#### 1. 서버 -&gt; 클라이언트 : JSON 이해하기
* JSON은 Key : Value로 이루어져 있다.
#### 2. 클라이언트 -&gt; 서버 : GET 요청 이해하기
* GET : 데이터 조회를 요청할 때
* POST : 데이터 생성, 변경, 삭제 요청할 때
* ? : 여기서부터 전달할 데이터가 작성된다는 의미
* &amp; : 전달할 데이터가 더 있다는 뜻
---
## Ajax
&gt; Ajax는 jQuery를 임포트한 페이지에서만 동작 가능함

#### Ajax 기본 골격</code></pre><p>$.ajax({
  type: &quot;GET&quot;,    // GET 방식으로 요청
  url: &quot;여기에URL을입력&quot;,    // 요청할 url
  data: {},    // 요청하면서 함께 줄 데이터 (GET 요청시엔 공란)
  success: function(response){    // 성공하면, 서버에서 준 결과를 response라는 변수에 담아 함수를 실행함
    console.log(response)    // 서버에서 준 결과를 이용해서 나머지 코드를 작성
  }
})</p>
<pre><code>&gt; GET 요청 
: url뒤에 아래와 같이 붙여서 데이터를 가져갑니다.
http://naver.com?param=value&amp;param2=value2 
POST 요청 
: data : {} 에 넣어서 데이터를 가져갑니다.
data: { param: &#39;value&#39;, param2: &#39;value2&#39; },

#### 개발자도구 콘솔에 찍어보기</code></pre><p>$.ajax({
  type: &quot;GET&quot;,
  url: &quot;<a href="http://spartacodingclub.shop/sparta_api/seoulair&quot;">http://spartacodingclub.shop/sparta_api/seoulair&quot;</a>,
  data: {},
  success: function(response){
        // 값 중 도봉구의 미세먼지 값만 가져와보기
        let dobong = response[&quot;RealtimeCityAir&quot;][&quot;row&quot;][11];
        let gu_name = dobong[&#39;MSRSTE_NM&#39;];
        let gu_mise = dobong[&#39;IDEX_MVL&#39;];
        console.log(gu_name, gu_mise);
  }
})</p>
<pre><code>#### 모든 구의 미세먼지 값을 찍어보기</code></pre><p>// 1. 미세먼지 데이터가 어디에 있는지 찾기 -&gt; RealtimeCityAir &gt; row 에 있는 미세먼지 데이터를 꺼내기
// 2. 반복문으로 구 데이터 출력해보기
// 3. 구 데이터에서 구 이름, 미세먼지 수치를 골라내어 출력하기
$.ajax({
  type: &quot;GET&quot;,
  url: &quot;<a href="http://spartacodingclub.shop/sparta_api/seoulair&quot;">http://spartacodingclub.shop/sparta_api/seoulair&quot;</a>,
  data: {},
  success: function (response) {
    let mise_list = response[&quot;RealtimeCityAir&quot;][&quot;row&quot;];    // row의 값을 mise_list에 담음
    for (let i = 0; i &lt; mise_list.length;  i++) {
      let mise = mise_list[i];
      // 구 이름, 미세먼지 수치 Key 값의 Value 출력
      let gu_name = mise[&quot;MSRSTE_NM&quot;];
      let gu_mise = mise[&quot;IDEX_MVL&quot;];
      console.log(gu_name, gu_mise);
    }
  }
});</p>
<pre><code>---
## jQuery + Ajax 조합 연습
#### 1. 서울시 OpenAPI(실시간 따릉기 현황)를 이용하기 (id = names-q1)</code></pre><pre><code>&lt;script&gt;
    function q1() {
        $(&#39;#names-q1&#39;).empty();
        $.ajax({
            type: &quot;GET&quot;,
            url: &quot;http://spartacodingclub.shop/sparta_api/seoulbike&quot;,
            data: {},
            success: function (response) {
                let rows = response[&quot;getStationListHist&quot;][&quot;row&quot;];
                for (let i = 0; i &lt; rows.length; i++) {
                    let rack_name = rows[i][&#39;stationName&#39;];
                    let rack_cnt = rows[i][&#39;rackTotCnt&#39;];
                    let bike_cnt = rows[i][&#39;parkingBikeTotCnt&#39;];
                    let temp_html = `&lt;tr&gt;
                                        &lt;td&gt;${rack_name}&lt;/td&gt;
                                        &lt;td&gt;${rack_cnt}&lt;/td&gt;
                                        &lt;td&gt;${bike_cnt}&lt;/td&gt;
                                    &lt;/tr&gt;`
                    $(&#39;#names-q1&#39;).append(temp_html);
                }
            }
        })
    }
&lt;/script&gt;</code></pre><pre><code>#### + 따릉이 대수가 5대 미만인 곳은 빨갛게 표시!</code></pre><style type="text/css">
        div.question-box {
            margin: 10px 0 20px 0;
        }

        table {
            border: 1px solid;
            border-collapse: collapse;
        }

        td,
        th {
            padding: 10px;
            border: 1px solid;
        }

        .urgent {
            color: red;
            font-weight: bold;
        }
    </style>

<pre><code>&lt;script&gt;
    function q1() {
        $(&#39;#names-q1&#39;).empty();
        $.ajax({
            type: &quot;GET&quot;,
            url: &quot;http://spartacodingclub.shop/sparta_api/seoulbike&quot;,
            data: {},
            success: function (response) {
                let rows = response[&quot;getStationList&quot;][&quot;row&quot;];
                for (let i = 0; i &lt; rows.length; i++) {
                    let rack_name = rows[i][&#39;stationName&#39;];
                    let rack_cnt = rows[i][&#39;rackTotCnt&#39;];
                    let bike_cnt = rows[i][&#39;parkingBikeTotCnt&#39;];
                    let temp_html = &#39;&#39;;
                    if (bike_cnt &lt; 5) {
                        temp_html = `&lt;tr class=&quot;urgent&quot;&gt;
                            &lt;td&gt;${rack_name}&lt;/td&gt;
                            &lt;td&gt;${rack_cnt}&lt;/td&gt;
                            &lt;td&gt;${bike_cnt}&lt;/td&gt;
                          &lt;/tr&gt;`
                    } else {
                        temp_html = `&lt;tr&gt;
                            &lt;td&gt;${rack_name}&lt;/td&gt;
                            &lt;td&gt;${rack_cnt}&lt;/td&gt;
                            &lt;td&gt;${bike_cnt}&lt;/td&gt;
                          &lt;/tr&gt;`
                    }
                    $(&#39;#names-q1&#39;).append(temp_html);
                }
            }
        })
    }
&lt;/script&gt;</code></pre><pre><code>---
## Ajax 연습_이미지, 텍스트 바꾸기
&gt;이미지 바꾸기 : $(&quot;#아이디값&quot;).attr(&quot;src&quot;, 이미지URL);
텍스트 바꾸기 : $(&quot;#아이디값&quot;).text(&quot;바꾸고 싶은 텍스트&quot;);
</code></pre><pre><code>&lt;script&gt;
  function q1() {
    $.ajax({
      type: &quot;GET&quot;,
      url: &quot;http://spartacodingclub.shop/sparta_api/rtan&quot;,
      data: {},
      success: function(response){
          let imgurl = response[&#39;url&#39;];
          $(&quot;#img-rtan&quot;).attr(&quot;src&quot;, imgurl);

          let msg = response[&#39;msg&#39;];
          $(&quot;#text-rtan&quot;).text(msg);
        }
      })
  }
&lt;/script&gt;</code></pre><pre><code>---
## 2주차 숙제
&gt; 참고) 로딩 후 호출하기
</code></pre><p>$(document).ready(function(){
    alert(&#39;다 로딩됐다!&#39;)
});</p>
<pre><code></code></pre><pre><code>&lt;script&gt;
    $(document).ready(function () {
        $.ajax({
            type: &quot;GET&quot;,
            url: &quot;http://spartacodingclub.shop/sparta_api/weather/seoul&quot;,
            data: {},
            success: function (response) {
                let temp = response[&#39;temp&#39;]

                $(&#39;#temp&#39;).text(temp)
            }

        })
    });
&lt;/script&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[220201_웹개발 종합반 - 1주차]]></title>
            <link>https://velog.io/@dev_inuu/220201%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-1%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@dev_inuu/220201%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-1%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Tue, 01 Feb 2022 14:20:35 GMT</pubDate>
            <description><![CDATA[<h3 id="웹은-처음만들어보는데요">웹은 처음만들어보는데요,,,</h3>
<p>웹개발종합반 1주차 강의 1회독했다!-!
HTML이 가물가물해서 오늘 좀 얼레벌레 따라간 것 같다,,
오늘부터 노션말구 벨로그에 공부한 거 정리해봅시당</p>
<h3 id="html-css">HTML, CSS</h3>
<blockquote>
<p>HTML = 큰 틀, CSS = 꾸미기</p>
</blockquote>
<p>HTML
: head 안에는 페이지의 속성 정보(눈에 안 보이는 필요한 것들을 담는 것), body 안에는 페이지의 내용을 담는다.</p>
<p>CSS에서 mytitle라는 클래스 가리킬 때 이 칭구를 써줘야 한다.</p>
<pre><code>.mytitle {
...
}</code></pre><h3 id="css-태그">CSS 태그</h3>
<blockquote>
<p>background-color : 영역 확인할 때 사용하니까 편했다.
background-image
background-size
background-position
border-radius
margin : 바깥 여백
padding : 안쪽 여백</p>
</blockquote>
<ul>
<li>margin 참고 (만들어둔 화면을 가운데로 가져올 때)
: width 주고 margin : auto 사용<h3 id="배경-넣을-때-참고">배경 넣을 때 참고</h3>
<pre><code>/*이미지 URL 앞에 사용된 코드 = 이미지를 어둡게 할 때 사용*/
background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)),url(&quot;이미지 URL&quot;);
background-position: center;
background-size: cover;</code></pre><h3 id="정렬할-때-참고">정렬할 때 참고</h3>
<pre><code>display: flex;
flex-direction: column;
justify-content: center;
align-items: center;</code></pre><h3 id="폰트-넣기">폰트 넣기</h3>
link 태그 복사 &gt; head 영역에<pre><code>&lt;link href=&quot;https://fonts.googleapis.com/css2?family=Jua&amp;display=swap&quot; rel=&quot;stylesheet&quot;&gt;</code></pre>CSS 복사해서 style 영역 내에 
```</li>
<li>{
  font-family: &#39;Gowun Dodum&#39;, sans-serif;
}<pre><code>### 모바일 처리
개인적으로 처음 생각해보게 된 것이라 신기했다,,,!
모바일에서는 가로 사이즈를 잘 해줘야 한다고 한다.
어디서나 500px로 (width: 500px)
&gt; 신기한 거 
: max 값 전까지 % 지정, 넘으면 max 값으로 표시
</code></pre></li>
</ul>
<pre><code>max-width: 500px
width: 95%</code></pre><h3 id="javascript">JavaScript</h3>
<p>크롬 개발자도구 열어서 콘솔 탭에서 작성해보았다.
띄어놓은 페이지에서 빠르게 자바스크립트를 테스트해볼 수 있다는 게 신기했던 것 같다....
console.log(변수) : 개발자가 결과값을 보기 편하도록 콘솔 창에 괄호 안의 값을 출력해준다.
let : 변수 선언
리스트 : ArrayList 같이 순서를 지켜서 가지고 있는 형태
딕셔너리 : HashMap 같이 Key-Value 값의 묶음</p>
<hr>
<h3 id="prachtml">prac.html</h3>
<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;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;스파르타코딩클럽 | HTML 기초&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;!-- 구역을 나누는 태그들 --&gt;
    &lt;div&gt;나는 구역을 나누죠&lt;/div&gt;
    &lt;p&gt;나는 문단이에요&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt; bullet point!1 &lt;/li&gt;
        &lt;li&gt; bullet point!2 &lt;/li&gt;
    &lt;/ul&gt;

    &lt;!-- 구역 내 콘텐츠 태그들 --&gt;
    &lt;h1&gt;h1은 제목을 나타내는 태그입니다. 페이지마다 하나씩 꼭 써주는 게 좋아요. 그래야 구글 검색이 잘 되거든요.&lt;/h1&gt;
    &lt;h2&gt;h2는 소제목입니다.&lt;/h2&gt;
    &lt;h3&gt;h3~h6도 각자의 역할이 있죠. 비중은 작지만..&lt;/h3&gt;
    &lt;hr&gt;
    span 태그입니다: 특정 &lt;span style=&quot;color:red&quot;&gt;글자&lt;/span&gt;를 꾸밀 때 써요
    &lt;hr&gt;
    a 태그입니다: &lt;a href=&quot;http://naver.com/&quot;&gt; 하이퍼링크 &lt;/a&gt;
    &lt;hr&gt;
    img 태그입니다: &lt;img src=&quot;https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png&quot; /&gt;
    &lt;hr&gt;
    input 태그입니다: &lt;input type=&quot;text&quot; /&gt;
    &lt;hr&gt;
    button 태그입니다: &lt;button&gt; 버튼입니다&lt;/button&gt;
    &lt;hr&gt;
    textarea 태그입니다: &lt;textarea&gt;나는 무엇일까요?&lt;/textarea&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre><h3 id="loginhtml">login.html</h3>
<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;link href=&quot;https://fonts.googleapis.com/css2?family=Gowun+Dodum&amp;display=swap&quot; rel=&quot;stylesheet&quot;&gt;
    &lt;style&gt;
        *{
            font-family: &#39;Gowun Dodum&#39;, sans-serif;
        }
        .mytitle {
            width: 300px;
            height: 200px;

            color: white;

            text-align: center;

            background-image: url(&quot;https://www.ancient-origins.net/sites/default/files/field/image/Agesilaus-II-cover.jpg&quot;);
            background-size: cover;
            background-position: center;

            border-radius: 10px;

            padding-top: 40px;
        }
        .wrap {
            width: 300px;
            margin: auto;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div class=&quot;wrap&quot;&gt;
        &lt;div class=&quot;mytitle&quot;&gt;
            &lt;h1&gt;로그인 페이지&lt;/h1&gt;
            &lt;h5&gt;아이디, 비밀번호를 입력해주세요&lt;/h5&gt;
        &lt;/div&gt;
        &lt;P&gt;ID: &lt;input type=&quot;text&quot;/&gt;&lt;/P&gt;
        &lt;P&gt;PW: &lt;input type=&quot;text&quot;/&gt;&lt;/P&gt;
        &lt;button&gt; 로그인하기&lt;/button&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><h3 id="indexhtml">index.html</h3>
<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;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1, shrink-to-fit=no&quot;&gt;

    &lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;
          integrity=&quot;sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC&quot; crossorigin=&quot;anonymous&quot;&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 src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js&quot;
            integrity=&quot;sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM&quot;
            crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;

    &lt;title&gt;스파르타코딩클럽 | 부트스트랩 연습하기&lt;/title&gt;
    &lt;link href=&quot;https://fonts.googleapis.com/css2?family=Gowun+Dodum&amp;display=swap&quot; rel=&quot;stylesheet&quot;&gt;
    &lt;style&gt;
        * {
            font-family: &#39;Gowun Dodum&#39;, sans-serif;
        }
        .mytitle {
            background-color: green;

            width: 100%;
            height: 250px;

            background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url(&quot;https://movie-phinf.pstatic.net/20210715_95/1626338192428gTnJl_JPEG/movie_image.jpg&quot;);
            background-position: center;
            background-size: cover;

            color: white;

            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
        }
        .mytitle &gt; button {
            width: 200px;
            height: 50px;

            background-color: transparent;
            color: white;

            border-radius: 50px;

            border: 1px solid white;

            margin-top: 10px;
        }
        .mytitle &gt; button:hover {
            border: 2px solid white;
        }
        .mycomment {
            color: grey;
        }
        .wrap {
            max-width: 1200px;
            width: 95%;

            margin: 20px auto 0px auto;
        }
        .mypost {
            max-width: 500px;
            width: 95%;

            margin: 20px auto 0px auto;

            box-shadow: 0px 0px 3px 0px grey;

            padding: 20px;
        }
        .mybtn {
            display: flex;
            flex-direction: row;
            justify-content: center;
            align-items: center;

            margin-top: 10px;
        }
        .mybtn &gt; button {
            margin-right: 10px;
        }
    &lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;div class=&quot;mytitle&quot;&gt;
    &lt;h1&gt;내 생애 최고의 영화들&lt;/h1&gt;
    &lt;button&gt;영화 기록하기&lt;/button&gt;
&lt;/div&gt;

&lt;div class=&quot;mypost&quot;&gt;
    &lt;div class=&quot;form-floating mb-3&quot;&gt;
        &lt;input type=&quot;email&quot; class=&quot;form-control&quot; id=&quot;floatingInput&quot; placeholder=&quot;name@example.com&quot;&gt;
        &lt;label for=&quot;floatingInput&quot;&gt;영화 URL&lt;/label&gt;
    &lt;/div&gt;

    &lt;div class=&quot;input-group mb-3&quot;&gt;
        &lt;label class=&quot;input-group-text&quot; for=&quot;inputGroupSelect01&quot;&gt;별점&lt;/label&gt;
        &lt;select class=&quot;form-select&quot; id=&quot;inputGroupSelect01&quot;&gt;
            &lt;option selected&gt;--선택하기--&lt;/option&gt;
            &lt;option value=&quot;1&quot;&gt;💗&lt;/option&gt;
            &lt;option value=&quot;2&quot;&gt;💗💗&lt;/option&gt;
            &lt;option value=&quot;3&quot;&gt;💗💗💗&lt;/option&gt;
            &lt;option value=&quot;3&quot;&gt;💗💗💗💗&lt;/option&gt;
            &lt;option value=&quot;3&quot;&gt;💗💗💗💗💗&lt;/option&gt;
        &lt;/select&gt;
    &lt;/div&gt;

    &lt;div class=&quot;form-floating&quot;&gt;
            &lt;textarea class=&quot;form-control&quot; placeholder=&quot;Leave a comment here&quot; id=&quot;floatingTextarea2&quot;
                      style=&quot;height: 100px&quot;&gt;&lt;/textarea&gt;
        &lt;label for=&quot;floatingTextarea2&quot;&gt;코멘트&lt;/label&gt;
    &lt;/div&gt;

    &lt;div class=&quot;mybtn&quot;&gt;
        &lt;button type=&quot;button&quot; class=&quot;btn btn-dark&quot;&gt;기록하기&lt;/button&gt;
        &lt;button type=&quot;button&quot; class=&quot;btn btn-outline-dark&quot;&gt;닫기&lt;/button&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;wrap&quot;&gt;
    &lt;div class=&quot;row row-cols-1 row-cols-md-4 g-4&quot;&gt;
        &lt;div class=&quot;col&quot;&gt;
            &lt;div class=&quot;card&quot;&gt;
                &lt;img src=&quot;https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg&quot;
                     class=&quot;card-img-top&quot; alt=&quot;...&quot;&gt;
                &lt;div class=&quot;card-body&quot;&gt;
                    &lt;h5 class=&quot;card-title&quot;&gt;여기에 제목이 들어갑니다.&lt;/h5&gt;
                    &lt;p class=&quot;card-text&quot;&gt;여기에 내용이 들어가지렁&lt;/p&gt;
                    &lt;p&gt;💗&lt;/p&gt;
                    &lt;p class=&quot;mycomment&quot;&gt;여기에 코멘트 들어갑니당&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class=&quot;col&quot;&gt;
            &lt;div class=&quot;card&quot;&gt;
                &lt;img src=&quot;https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg&quot;
                     class=&quot;card-img-top&quot; alt=&quot;...&quot;&gt;
                &lt;div class=&quot;card-body&quot;&gt;
                    &lt;h5 class=&quot;card-title&quot;&gt;여기에 제목이 들어갑니다.&lt;/h5&gt;
                    &lt;p class=&quot;card-text&quot;&gt;여기에 내용이 들어가지렁&lt;/p&gt;
                    &lt;p&gt;⭐⭐⭐&lt;/p&gt;
                    &lt;p class=&quot;mycomment&quot;&gt;여기에 코멘트 들어갑니당&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class=&quot;col&quot;&gt;
            &lt;div class=&quot;card&quot;&gt;
                &lt;img src=&quot;https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg&quot;
                     class=&quot;card-img-top&quot; alt=&quot;...&quot;&gt;
                &lt;div class=&quot;card-body&quot;&gt;
                    &lt;h5 class=&quot;card-title&quot;&gt;여기에 제목이 들어갑니다.&lt;/h5&gt;
                    &lt;p class=&quot;card-text&quot;&gt;여기에 내용이 들어가지렁&lt;/p&gt;
                    &lt;p&gt;⭐⭐⭐&lt;/p&gt;
                    &lt;p class=&quot;mycomment&quot;&gt;여기에 코멘트 들어갑니당&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class=&quot;col&quot;&gt;
            &lt;div class=&quot;card&quot;&gt;
                &lt;img src=&quot;https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg&quot;
                     class=&quot;card-img-top&quot; alt=&quot;...&quot;&gt;
                &lt;div class=&quot;card-body&quot;&gt;
                    &lt;h5 class=&quot;card-title&quot;&gt;여기에 제목이 들어갑니다.&lt;/h5&gt;
                    &lt;p class=&quot;card-text&quot;&gt;여기에 내용이 들어가지렁&lt;/p&gt;
                    &lt;p&gt;⭐⭐⭐&lt;/p&gt;
                    &lt;p class=&quot;mycomment&quot;&gt;여기에 코멘트 들어갑니당&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;/body&gt;

&lt;/html&gt;</code></pre><h3 id="homeworkhtml">homework.html</h3>
<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;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1, shrink-to-fit=no&quot;&gt;

    &lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;
          integrity=&quot;sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC&quot; crossorigin=&quot;anonymous&quot;&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 src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js&quot;
            integrity=&quot;sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM&quot;
            crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;

    &lt;title&gt;스파르타코딩클럽 | 부트스트랩 연습하기&lt;/title&gt;
    &lt;link href=&quot;https://fonts.googleapis.com/css2?family=Gowun+Dodum&amp;display=swap&quot; rel=&quot;stylesheet&quot;&gt;

    &lt;style&gt;
        * {
            font-family: &#39;Gowun Dodum&#39;, sans-serif;
        }

        .mytitle {
            width: 100%;
            height: 250px;

            background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url(&quot;https://t1.daumcdn.net/cfile/tistory/99F3D3435C8F7C6901?original&quot;);
            background-position: center;
            background-size: cover;

            color: white;

            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
        }

        .mypost {
            max-width: 500px;
            width: 95%;
            margin: 20px auto 20px auto;
            box-shadow: 0px 0px 3px 0px grey;
            padding: 20px;
        }

        .mybtn {
            display: flex;
            margin-top: 10px;
        }

        .mybtn &gt; button {
            margin-right: 10px;
        }

        .card {
            max-width: 500px;
            width: 95%;
            height: 85px;
            margin: 10px auto 0px auto;
        }
    &lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div class=&quot;mytitle&quot;&gt;
        &lt;h1&gt;백예린 팬명록&lt;/h1&gt;
    &lt;/div&gt;
    &lt;div class=&quot;mypost&quot;&gt;
        &lt;div class=&quot;form-floating mb-3&quot;&gt;
            &lt;input type=&quot;email&quot; class=&quot;form-control&quot; id=&quot;floatingInput&quot; placeholder=&quot;name@example.com&quot;&gt;
            &lt;label for=&quot;floatingInput&quot;&gt;닉네임&lt;/label&gt;
        &lt;/div&gt;
        &lt;div class=&quot;form-floating&quot;&gt;
                        &lt;textarea class=&quot;form-control&quot; placeholder=&quot;Leave a comment here&quot; id=&quot;floatingTextarea2&quot;
                                  style=&quot;height: 100px&quot;&gt;&lt;/textarea&gt;
            &lt;label for=&quot;floatingTextarea2&quot;&gt;응원 댓글&lt;/label&gt;
        &lt;/div&gt;
        &lt;div class=&quot;mybtn&quot;&gt;
            &lt;button type=&quot;button&quot; class=&quot;btn btn-dark&quot;&gt;응원 남기기&lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-body&quot;&gt;
            &lt;blockquote class=&quot;blockquote mb-0&quot;&gt;
                &lt;p&gt;백예린 앨범 많관부&lt;/p&gt;
                &lt;footer class=&quot;blockquote-footer&quot;&gt;메론빵 &lt;cite title=&quot;Source Title&quot;&gt;&lt;/cite&gt;
                &lt;/footer&gt;
            &lt;/blockquote&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-body&quot;&gt;
            &lt;blockquote class=&quot;blockquote mb-0&quot;&gt;
                &lt;p&gt;백예린 앨범 많관부&lt;/p&gt;
                &lt;footer class=&quot;blockquote-footer&quot;&gt;메론빵 &lt;cite title=&quot;Source Title&quot;&gt;&lt;/cite&gt;
                &lt;/footer&gt;
            &lt;/blockquote&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-body&quot;&gt;
            &lt;blockquote class=&quot;blockquote mb-0&quot;&gt;
                &lt;p&gt;백예린 앨범 많관부&lt;/p&gt;
                &lt;footer class=&quot;blockquote-footer&quot;&gt;메론빵 &lt;cite title=&quot;Source Title&quot;&gt;&lt;/cite&gt;
                &lt;/footer&gt;
            &lt;/blockquote&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre>]]></description>
        </item>
    </channel>
</rss>