1.수업내용정리

-flask 프로젝트의 폭더 구조는 정해져있다~ 잊지마~~!!

*폴더 안 app.py 파일 생성 > 폴더안에 templates 폴더 생성 > templates 폴더 안 index.html 파일 생성

-가상환경, 패키지 설치(가상환경 왜 잡아? 남이 만든 라이브러리 다운로드, 다운받을 통이 있어야하는데 그게 가상환경)

*새터미널 > python -m venv venv 엔터하고 파이썬 버전 venv로 변경 > (venv)라고 뜨면 활성화 완료

*터미널 > pip install flask pymongo dnspython(여러개 쓸 때는 띄어쓰기)/+크롤링필요할때 requests bs4 총 5개

-app.py, index.html 뼈대 만들기

불러오기랑 저장하기 중 저장하기 먼저 만들어라

GET : 데이터 조회(나중에 불러오기)

POST : 데이터 생성, 변경, 삭제 요청할 때 쓰임(먼저 서버 만들기 ex.app.py) : 완성하면 DB 확인하기

-og태그

 

static 폴더 아래에 이미지 파일을 넣고,

각자 프로젝트 HTML의 <head>~</head> 사이에

아래 내용을 작성하면 og 태그를 개인 프로젝트에 사용할 수 있습니다.

 

 

 

 

 

<meta property="og:title" content="내 사이트의 제목" />
<meta property="og:description" content="보고 있는 페이지의 내용 요약" />
<meta property="og:image" content="이미지URL" />

-AWS Elastic Beanstalk으로 배포

*배포 명령어

- 터미널 준비하기 - 
mkdir deploy
cp app.py deploy/application.py
cp -r templates deploy/templates
pip freeze > deploy/requirements.txt
cd deploy

- application.py 세팅하기 - 
application = app = Flask(__name__)
app.run()

- 패키지 설치하기 - 
pip install awsebcli

- 보안 자격증명 - 
eb init

- 초기 설정 - 
eb create myweb

- 코드 수정 & 업데이트 - 
eb deploy myweb

cd deploy하기 전에 clear하기

ed init

Select a default region : 10 (seoul)

AWS Access Key ID [None]: 발급된 액세스 키 ID (복사 붙여넣기)
AWS Secret Access Key [None]: 발급된 비밀 액세스 키 (복사 붙여넣기)

Enter Application Name (default is "deploy") : enter
It appears you are using Python. Is this correct? : Y
Select a platform branch (default is 1) : enter

Do you want use Codecommit? : N
---
Cannot setup CodeCommit because there is no Source Control setup, continuing with initialization
Do you want to set up SSH for your instances? : Y

Select a keypair : [Create new Keypair]

Type a keypair name : enter
Enter passphrase : enter
Enter same passphrase again : enter

서버배포 실패해서 삭제하고 다시 만들고 하니까(3번정도,,ㅋ) 마스터한 느낌이다.. 

 

2.참고 자료, 해당 내용이 활용되는 부분


3. 오늘 새로 배운 내용


4. 개발 중 발생한 이슈/고민 또는 이를 해결한 내용

고민은 메모장에 적었다.. 지금은 이게 문제가 아니다..삭제버튼 만들러가야한다..

1.수업내용정리

-Flask

*서버만들기

1.폴더와 파일 생성

폴더 안에 app.py 파일 생성(변경가능, 라이브러리 이름과 같으면 안됨)

폴더 안에 templates 폴더 생성(반드시 고정!)

templates 폴더 안에 index.html 파일생성

2.가상환경venv

새터미널 > 터미널이 bash로 생성

(bash가 아닌 것 이 뜨면 python -m venv venv

3.venv 활성화하기

app.py 파일을 클릭 > VS Code 오른쪽 아래의 파이썬 버전(예: 3.9.6)을 클릭한 뒤, 화면 위쪽에서 venv가 쓰여있는 파이썬 버전을 클릭 > 터미널에서 오른쪽의 십자버튼(➕) > 터미널에서 (venv) 라고 뜨면 가상환경이 활성화 

4.Flask 패키지 설치하기

터미널에 pip instal flask 엔터

*flask 시작 코드 ( 터미널 창에서 ctrl + c 누르면 서버 종료)

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
   return 'This is Home!'

if __name__ == '__main__':  
   app.run('0.0.0.0',port=5000,debug=True)

*html 파일 불러오기

간단한 index.html 파일을 templates 안에 만들고 html 파일 불러오기(flask 내장함수 render_template 이용)

from flask import Flask, render_template
app = Flask(__name__)

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

@app.route('/')
def home():
   return render_template('index.html')

if __name__ == '__main__':
   app.run('0.0.0.0', port=5000, debug=True)

-화성땅 공동구매/스파르타피디아

*프로젝트 설정(flask 폴더 구조 만들기 > 가상환경 생성, 패키지 설치

* POST 연습(포스팅하기)

* GET 연습(보여주기) : 데이터 조회는 GET방식~~!!!

*완성코드(순서대로 app.py, index.html)

from flask import Flask, render_template, request, jsonify
app = Flask(__name__)

from pymongo import MongoClient
client = MongoClient('내 mongoDB URL')
db = client.dbsparta

import requests
from bs4 import BeautifulSoup

@app.route('/')
def home():
    return render_template('index.html')

@app.route("/movie", methods=["POST"])
def movie_post():
    url_receive = request.form['url_give']
    comment_receive = request.form['comment_give']

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
    data = requests.get(url_receive, headers=headers)

    soup = BeautifulSoup(data.text, 'html.parser')

    ogimage = soup.select_one('meta[property="og:image"]')['content']
    ogtitle = soup.select_one('meta[property="og:title"]')['content']
    ogdesc = soup.select_one('meta[property="og:description"]')['content']


    doc = {
        'image':ogimage,
        'title':ogtitle,
        'desc':ogdesc,
        'comment':comment_receive
    }

    db.movies.insert_one(doc)

    return jsonify({'msg':'저장완료!'})

@app.route("/movie", methods=["GET"])
def movie_get():
    all_movies = list(db.movies.find({},{'_id':False}))
    return jsonify({'result':all_movies})

if __name__ == '__main__':
    app.run('0.0.0.0', port=5000, debug=True)
<!doctype html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
        crossorigin="anonymous"></script>

    <title>스파르타 피디아</title>

    <link href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap" rel="stylesheet">

    <style>
        * {
            font-family: 'Gowun Dodum', 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('https://movie-phinf.pstatic.net/20210715_95/1626338192428gTnJl_JPEG/movie_image.jpg');
            background-position: center;
            background-size: cover;

            color: white;

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

        .mytitle>button {
            width: 200px;
            height: 50px;

            background-color: transparent;
            color: white;

            border-radius: 50px;
            border: 1px solid white;

            margin-top: 10px;
        }

        .mytitle>button:hover {
            border: 2px solid white;
        }

        .mycomment {
            color: gray;
        }

        .mycards {
            margin: 20px auto 0px auto;
            width: 95%;
            max-width: 1200px;
        }

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

            display: none;
        }

        .mybtns {
            display: flex;
            flex-direction: row;
            align-items: center;
            justify-content: center;

            margin-top: 20px;
        }

        .mybtns>button {
            margin-right: 10px;
        }
    </style>
    <script>
        $(document).ready(function () {
            listing();
        });

        function listing() {
            fetch('/movie').then((res) => res.json()).then((data) => {
                let rows = data['result']
                $('#cards-box').empty()
                rows.forEach((a)=>{
                    let comment = a['comment']
                    let title = a['title']
                    let desc = a['desc']
                    let image = a['image']

                    let temp_html = `<div class="col">
                                        <div class="card h-100">
                                            <img src="${image}"
                                                class="card-img-top">
                                            <div class="card-body">
                                                <h5 class="card-title">${title}</h5>
                                                <p class="card-text">${desc}</p>
                                                <p>⭐⭐⭐</p>
                                                <p class="mycomment">${comment}</p>
                                            </div>
                                        </div>
                                    </div>`
                    $('#cards-box').append(temp_html)
                })
            })
        }

        function posting() {
            let url = $('#url').val()
            let comment = $('#comment').val()

            let formData = new FormData();
            formData.append("url_give", url);
            formData.append("comment_give", comment);

            fetch('/movie', { method: "POST", body: formData }).then((res) => res.json()).then((data) => {
                alert(data['msg'])
                window.location.reload()
            })
        }

        function open_box() {
            $('#post-box').show()
        }
        function close_box() {
            $('#post-box').hide()
        }
    </script>
</head>

<body>
    <div class="mytitle">
        <h1>내 생애 최고의 영화들</h1>
        <button onclick="open_box()">영화 기록하기</button>
    </div>
    <div class="mypost" id="post-box">
        <div class="form-floating mb-3">
            <input id="url" type="email" class="form-control" placeholder="name@example.com">
            <label>영화URL</label>
        </div>
        <div class="form-floating">
            <textarea id="comment" class="form-control" placeholder="Leave a comment here"></textarea>
            <label for="floatingTextarea2">코멘트</label>
        </div>
        <div class="mybtns">
            <button onclick="posting()" type="button" class="btn btn-dark">기록하기</button>
            <button onclick="close_box()" type="button" class="btn btn-outline-dark">닫기</button>
        </div>
    </div>
    <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">
                    <div class="card-body">
                        <h5 class="card-title">영화 제목이 들어갑니다</h5>
                        <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
                        <p>⭐⭐⭐</p>
                        <p class="mycomment">나의 한줄 평을 씁니다</p>
                    </div>
                </div>
            </div>
            <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">
                    <div class="card-body">
                        <h5 class="card-title">영화 제목이 들어갑니다</h5>
                        <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
                        <p>⭐⭐⭐</p>
                        <p class="mycomment">나의 한줄 평을 씁니다</p>
                    </div>
                </div>
            </div>
            <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">
                    <div class="card-body">
                        <h5 class="card-title">영화 제목이 들어갑니다</h5>
                        <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
                        <p>⭐⭐⭐</p>
                        <p class="mycomment">나의 한줄 평을 씁니다</p>
                    </div>
                </div>
            </div>
            <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">
                    <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>
</body>

</html>

 

2.참고 자료, 해당 내용이 활용되는 부분

- 모르면 구글링 하자


3. 오늘 새로 배운 내용

-숫자를 별로 표시하기

구글링 > 자바스크립트 문자 반복 > repeat()

let start = a['star']
let star_repeat = '⭐'.repeat(star)

let temp_html = `<div class="col">
                  <div class="card h-100">
                      <img src="${image}"
                           class="card-img-top">
                      <div class="card-body">
                          <h5 class="card-title">${title}</h5>
                          <p class="card-text">${desc}</p>
                          <p>${star_repeat}</p>
                          <p class="mycomment">${comment}</p>
                      </div>
                  </div>
	              </div>`


4. 개발 중 발생한 이슈/고민 또는 이를 해결한 내용

-주고 받는 관계?app.py, index.html를 좀 이해하면 괜찮을 것 같다 

아직은 따라하는 느낌이라 잘 모르겠다

숫자를 이모티콘으로 표시하는 방법이 있다는 것을 생각해야겠다..어제 애먹은게 4주차에 있었고만,,ㅎ

1.수업내용정리

-python : 매우 직관적, 할 수 있는 것 많음, 필요한 것들은 구글링해서 찾아보기!

*기초 문법

*변수 & 기본연산

a = 3      # 3을 a에 넣는다
b = a      # a를 b에 넣는다
a = a + 1  # a+1을 다시 a에 넣는다

num1 = a*b # a*b의 값을 num1이라는 변수에 넣는다
num2 = 99 # 99의 값을 num2이라는 변수에 넣는다

# 변수의 이름은 마음대로 지을 수 있음!
# 진짜 "마음대로" 짓는 게 좋을까? var1, var2 이렇게?

*자료형

숫자, 문자형
name = 'bob' # 변수에는 문자열이 들어갈 수도 있고,
num = 12 # 숫자가 들어갈 수도 있고,

is_number = True # True 또는 False -> "Boolean"형이 들어갈 수도 있습니다.

#########
# 그리고 List, Dictionary 도 들어갈 수도 있죠. 그게 뭔지는 아래에서!

리스트 형 (Javascript의 배열형과 동일)
a=['사과','배','감']
print(a[0]) #사과

Dictionary 형 (Javascript의 dictionary형과 동일)
a= {}
a= {'name':'영수','age':24}


# a의 값은? {'name':'영수','age':24}
# a['name']의 값은? '영수'

*함수

-함수의 정의 - 이름은 마음대로 정할 수 있음!
# 수학문제에서
f(x) = 2*x+3
y = f(2)
y의 값은? 7

# 참고: 자바스크립트에서는
function f(x) {
	return 2*x+3
}

# 파이썬에서
def f(x):
	return 2*x+3

y = f(2)
y의 값은? 7

-함수의 응용
def hey():
	print("헤이")

#파이썬에서 함수 생성시, 들여쓰기는 중요해요!

hey() #헤이

def sum(a,b,c):
	return a+b+c

result = sum(1,2,3)
print(result) #6

 

*조건문 : if / else

age = 25

if age > 20:
	print("성인입니다")
else:
	print("청소년입니다")

*반복문 : 리스트의 요소들을 하나씩 꺼내쓰는 형태. 즉, 무조건 리스트와 함께

fruits = ['사과','배','감','귤']

for fruit in fruits:
	print(fruit)

# 사과, 배, 감, 귤 하나씩 꺼내어 찍힙니다.

ages =[5,10,13,23,25,9]

for a in ages:
	if a>20:
		print("성인입니다")
	else:
		print("청소년입니다")

-크롤링

가상환경 활성화(venv) > pip install bs4

*기본세팅

import requests
from bs4 import BeautifulSoup

# 타겟 URL을 읽어서 HTML를 받아오고,
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(data.text, 'html.parser')

#############################
# (입맛에 맞게 코딩)
#############################

*selsct / select_one   태그 안의 텍스트를 찍고 싶을 땐 → 태그.text 태그 안의 속성을 찍고 싶을 땐 → 태그['속성']

import requests
from bs4 import BeautifulSoup

# URL을 읽어서 HTML를 받아오고,
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
soup = BeautifulSoup(data.text, 'html.parser')

# select를 이용해서, tr들을 불러오기
a = soup.select_one('#old_content > table > tbody > tr:nth-child(3) > td.title > div > a')

trs = soup.select('#old_content > table > tbody > tr')

# movies (tr들) 의 반복문을 돌리기
for tr in trs:
    # movie 안에 a 가 있으면,
		a = tr.select_one('td.title > div > a')
    if a is not None:
        # a의 text를 찍어본다.
        print (a.text)
# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')

soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')

# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')

# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')

항상 정확하지는 않으나, 크롬 개발자도구 참고 가능

  1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
  2. 원하는 태그에서 마우스 오른쪽 클릭
  3. Copy → Copy selector로 선택자를 복사할 수 있음

- MongoDB(>No-SQL :딕셔너리 형태로 데이터를 저장해두는 DB, 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있음)

*패키지 설치

  1. 터미널을 열고, 마지막 경로가 pythonprac 인지 확인
  2. (venv) 로 가상환경이 활성화 되었는지 확인
  3. pip install pymongo, dnspython 입력하고 엔터

*기본 코드

from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')
db = client.dbsparta

난 이거 안돼서 다른 거 찾아 씀,,ㅜㅜ 이유는 아직도 모름,,

스파르타코딩클럽 즉문즉답에서 검색해서 찾은 코드,,엄청 애먹었다,, 몽고디비 회원가입만 3번 한거 안비밀,,ㅎ

from pymongo import MongoClient
import certifi

ca = certifi.where()

client = MongoClient('mongodb+srv://sparta:test@cluster0.brkky9q.mongodb.net/?retryWrites=true&w=majority', tlsCAFile=ca)
db = client.dbsparta

certifi에 노란줄이 뜨면 터미널에 pip install certifi 명령어 입력!!

(4주차 이후부터 복붙할 때 노란줄 뜸,,^-^)

*코드요약(복붙해서 쓰면 됨)

# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})

# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))

# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

# 지우기 - 예시
db.users.delete_one({'name':'bobby'})

 

2.참고 자료, 해당 내용이 활용되는 부분

requests python docs:영어설명 https://requests.readthedocs.io/en/latest/

> requests python 사용법 (구글에 검색)

 

3. 오늘 새로 배운 내용

-fetch :별이 ⭐️ 모양이 들어가야 하는데 그냥 숫자가 들어갈 때는 구글링 해보기 → 자바스크립트 숫자 반복 → repeat()

별을 반복한 값을 repeat()를 사용해 변수로 담아 붙이기

 let star = movie['star']
 
 let star_image = '⭐'.repeat(star)

-먼저 있던 내용 지우기 (forEach 전에)

$('#AAAAAA').empty('');

-리스트 나오면 for (변수?:a) in rows:

-스크래핑 :앞에서 두 글자만 끊기! text[0:2], 옆에 여백이 있다던가, 다른 글씨도 나온다던가.. 파이썬 내장 함수인 strip()

 

4. 개발 중 발생한 이슈/고민 또는 이를 해결한 내용

프론트엔드는 자바스크립트?, 백엔드는 파이썬?

 

숙제 지니뮤직 스크래핑하고 멜론도 해보았다. 재밌었다 ㅎㅎ

1. 수업 내용 정리

-javascript : 웹을 움직이게 하는 코드(모든 웹서버는 HTML + CSS + javascript

unction hey()라는 규칙으로 hey라는 함수를 만들었고, alert(&rsquo;안녕&rsquo;)이라는 작업을 원할 때마다 반복적으로 수행

*console.log() : 매번 버튼 클릭해서 실행하는 것은 불편 하기에 alert > console.log로 바꿔 확인/마우스오른쪽클릭>검사

*변수 : let으로 변수 선언, 직관적, 알아볼 수 있게

ex) let a = 2, a = 'bob' //문자열은 작은 따옴표

*리스트 : 순서를 지켜서 가지고 있는 형태, 첫 번째 값은 [0]

let a_list = []  // 리스트를 선언. 변수 이름은 역시 아무렇게나 가능!

// 또는,

let a = ['사과','수박','딸기','감'] // 로 선언 가능

console.log(a[1]) // 수박
console.log(a[0]) // 사과

//리스트 길이 구하기
console.log(a.length) //4

*딕셔너리 : 키(key)-밸류(value) 값의 묶음

let a_dict = {}  // 딕셔너리 선언. 변수 이름은 역시 아무렇게나 가능!

// 또는,

let a = {'name':'영수','age':27} // 로 선언 가능

console.log(a)
console.log(a['name']) // 영수
console.log(b_dict['age']) // 27

*리스트 + 딕셔너리

let a = [
	{'name':'영수','age':27},
	{'name':'철수','age':15},
	{'name':'영희','age':20}
]
console.log(a[0]['name']) //영수
console.log(a[1]['age']) //15

 

-jQuery : html 뼈대 선택해서 쉽게 조작 (=bootstrap, 남들이 만든 코드모음, 라이브러리)

Javascript로 길고 복잡하게 써야 하는 것을

document.getElementById("element").style.display = "none";

jQuery로 보다 직관적으로 쓸 수 있EK

$('#element').hide();

jQuery는 Javascript와 다른 특별한 소프트웨어가 아니라 미리 작성된 Javascript 코드입니다. 전문 개발자들이 짜둔 코드를 잘 가져와서 사용하는 것!

(그렇게 때문에, 쓰기 전에 "임포트(미리 작성된 Javascript 코드를 가져오는 것)"를 해야한다)

*반복문 : forEach(() => {})

let fruits = ['사과','배','감','귤']
fruits.forEach((a) => {
	console.log(a)
})

*조건문 : if (조건) {} else {}

let age = 24

if (age > 20) {
	console.log('성인입니다')
} else {
	console.log('청소년입니다')
}

*반복문+조건문

let ages = [12,15,20,25,17,37,24]

ages.forEach((a)=> {
	if (a > 20) {
		console.log('성인입니다')
	} else {
		console.log('청소년입니다')
	}
})

*append() : 

temp_html 이라는 변수를 만들 때는 백틱(``) ,

태그 안에 들어갈 값은 ${},

통째로 넣을 html요소를 $('#아이디').append(변수:html)

function checkResult() {
	let fruits = ['사과','배','감','귤','수박']
	$('#q1').empty()
	fruits.forEach((a)=>{
		let temp_html = `<p>${a}</p>`
		$('#q1').append(temp_html)
	})
}
let people = [
	{'name':'서영','age':24},
	{'name':'현아','age':30},
	{'name':'영환','age':12},
	{'name':'서연','age':15},
	{'name':'지용','age':18},
	{'name':'예지','age':36}
]
$('#q2').empty()
people.forEach((a)=>{
		let name = a['name']
		let age a['age']
		let temp_html = `<p>${a}</p>`
		$('#q2').append(temp_html)
	})

-Fetch : 짧은 코드로 요청을 보내고 받아옴

fetch("여기에 URL을 입력") // 이 URL로 웹 통신을 요청한다. 괄호 안에 다른 것이 없다면 GET!
	.then(res => res.json()) // 통신 요청을 받은 데이터는 res라는 이름으로 JSON화 한다
	.then(data => { 
		console.log(data) // 개발자 도구에 찍어보기
	}) // JSON 형태로 바뀐 데이터를 data라는 이름으로 붙여 사용한다

ex)기본

fetch("http://spartacodingclub.shop/sparta_api/seoulair") // 기본 요청(GET)
	.then(res => res.json()) // 요청해서 받은 데이터를 JSON화
	.then(data => { // JSON화 한 데이터를 다시 data로 이름짓기
		let rows = data['RealtimeCityAir']['row']
		rows.forEach((a) => {
			// 미세먼지 데이터 리스트의 길이만큼 반복해서 하나씩 개발자 도구에서 보기
			// 구의 이름, 미세먼지 수치 값을 개발자 도구에서 찍어보기
			console.log(a['MSRSTE_NM'], a['IDEX_MVL'])
		})
	})

fetch("http://spartacodingclub.shop/sparta_api/seoulair").then(res => res.json()).then(data => { 
		let rows = data['RealtimeCityAir']['row']
		rows.forEach((a) => {
			console.log(a['MSRSTE_NM'], a['IDEX_MVL'])
		})
	})

ex)응용

    <style>
        div.question-box {
            margin: 10px 0 20px 0;
        }
        .bad {
            color: red;
        }
    </style>

    <script>
			function q1() {
        fetch("http://spartacodingclub.shop/sparta_api/seoulair").then((response) => response.json()).then((data) => {
            $('#names-q1').empty()
						let rows = data['RealtimeCityAir']['row']
            rows.forEach((a) => {
                let gu_name = a['MSRSTE_NM']
								let gu_mise = a['IDEX_MVL']
								let temp_html = ``
								if (gu_mise > 40) {
									temp_html = `<li class="bad">${gu_name} : ${gu_mise}</li>`
								} else {
									temp_html = `<li>${gu_name} : ${gu_mise}</li>`
								}
                $('#names-q1').append(temp_html)
            });
          })
      }
    </script>

2. 참고 자료, 해당 내용이 활용되는 부분

 


3. 오늘 새로 배운 내용

API는 은행 창구와 같은 것!

같은 예금 창구에서도 개인 고객이냐 기업 고객이냐에 따라 가져와야 하는 것 / 처리해주는 것이 다른 것처럼, 클라이언트가 요청 할 때에도, "타입"이라는 것이 존재

* GET → 통상적으로! 데이터 조회(Read)를 요청할 때 예) 영화 목록 조회

GET 방식으로 데이터를 전달하는 방법

? : 여기서부터 전달할 데이터가 작성된다는 의미

& : 전달할 데이터가 더 있다는 뜻 예시) google.com/search?q=아이폰&sourceid=chrome&ie=UTF-8

위 주소는 google.com의 search 창구에 다음 정보를 전달

q=아이폰 (검색어) / sourceid=chrome / (브라우저 정보) / ie=UTF-8 (인코딩 정보)

* POST → 통상적으로! 데이터 생성(Create), 변경(Update), 삭제(Delete) 요청 할 때 예) 회원가입, 회원탈퇴, 비밀번호 수정


4. 개발 중 발생한 이슈/고민 또는 이를 해결한 내용

처음에는 이해가 가는듯 안가는듯 한데 계속 듣다보니 이해보다는 통으로 외우는게 편한것 같다 ㅎ,ㅎ

조건문, 반복문, append(temp_html) 등 코드가 바로 생각날 정도로 외우는 것도 나쁘지 않을 것 같다..

혼자 새로 만들면 막막할듯 싶지만 해봐야겠지 ㅎ,, 

1. 수업 내용 정리

-웹(web)!

ex. https://naver.com/ > "naver.com" 은행지점, "/" 창구

-HTML은 뼈대, CSS는 꾸미기!

코드 자동정렬 shift + alt + f

주석 달기 ctrl + /

*html

코드화면 > open with live server : 내가 적은 코드가 실제로 보이는 화면

head(meta, script, link, title 등) 페이지 속성 정보 /

body(<div>구역, 한줄 다 먹음:박스는 div <p>문단 <h1>제목 <hr>태그:<butten> 등) 페이지 내용

ex. <div class="mytitle"><h1><h5></div>

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>스파르타코딩클럽 | HTML 기초</title>
</head>

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

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

</html>

*css

<head> ~ </head> 안에 <style> ~ </style>, mytitle라는 클래스를 가리킬 때, .mytitle { ... }

검색 예 : "css 모서리 둥글게" border-radius

번호는 자주 쓰는 순서대로 표기

배경관련 1.background-color(구역확인)

7.background-image: url(' '); 8.background-position(center) 9.background-size(cover:꽉맞게/7,8,9 세줄 늘 같이!

사이즈px; 2.width 3.height

폰트 font-size font-weight font-family 4.color

간격 5.text-align(가운데 정렬) margin 6.padding(시계방향 : 위20px 오20px 아래20px 왼20px; ,auto:쭉 밀기) 

margin과 padding ( → 헷갈리지 말기!) - margin은 바깥 여백을, padding은 내 안쪽 여백

로그인 화면 가운데로 옮기기 : 전체를 박스로 <div></div>

파일 분리 : <!-- style.css 파일을 같은 폴더에 만들고, head 태그에서 불러오기 --<link rel="stylesheet" type="text/css" href = "(css파일이름).css">

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .mytitle {

        }
        .mybtn {

        }
		.mytxt {

        }
    </style>
</head>
<body>
    <h1 class="mytitle">로그인 페이지</h1>
    <p class="mytxt">ID: <input type="text"/></p>
    <p class="mytxt">PW: <input type="text"/></p>
    <button class="mybtn">로그인하기</button>
</body>
</html>

2.참고 자료, 해당 내용이 활용되는 부분

3. 오늘 새로 배운 내용

Github에서 파일 배포할 때 제목 무조건 index.html

수정할 때 : code > index.html > 연필모양 > 코드변경 > commit changes

 

4. 개발 중 발생한 이슈/고민 또는 이를 해결한 내용

-한 글자라도 틀렸을 때 오류가 뜨면 틀린 코드를 찾기 힘들기때문에 처음부터 잘 적어야겠다는 생각을 했다..

 강의를 보면서 따라하니까 쉬운건지,, 1주차라서 쉬운건지 가늠이 안간다,, 

 html 뼈대는 가져와서 바꾸는 것인가,, 내가 새로 만들기는 무리,,

 

-깃허브에서 새로운 파일을 배포할때는..?

>수정하는 것과 같음.

+ Recent posts