์ง๋ํ
01 - 02 ๋ณต์ต
03 - 06 ํ์ด์ฌ ๊ธฐ์ด ๊ณต๋ถ
07 - 08 ํ์ด์ฌ_ํฌ๋กค๋ง
09 - 14 mongoDB
๋ก๋ฉํ ๋ฐ๋ก ํธ์ถํ๊ธฐ
$(document).ready(function(){
listing();
});
function listing() {
console.log('ํ๋ฉด ๋ก๋ฉ ํ ์ ์คํ๋์์ต๋๋ค');
}
//๋ณ ์ถ๋ ฅ. ์ซ์ ์
๋ ฅ->๋ณ ๊ฐ์๋๋ก ๋์ค๋๋ก
let star_image = 'โญ'.repeat(star)
์ด๋ฐ์ ํด๋์ ์นด๋๋ฐ์ค๋ empty()ํจ์๋ฅผ ์ด์ฉํด ๊ฐ๋ ค์ฃผ๊ฑฐ๋ ์ง์ฐ๊ธฐ
$('#cards-box').empty()
//๋ก๋ฉํ ๋ฐ๋ก ์คํ
$(document).ready(function () {
listing();
});
function listing() {
$('#cards-box').empty()
$.ajax({
type: "GET",
url: "http://spartacodingclub.shop/web/api/movie",
data: {},
success: function (response) {
let rows = response['movies']
//์ for๋ฌธ์ผ๋ก ๋๋ ๊ฑธ๊น?
for (let i = 0; i < rows.length; i++){
let title = rows[i]['title']
let desc = rows[i]['desc']
let image = rows[i]['image']
let star = rows[i]['star']
let comment = rows[i]['comment']
//๋ณ ์ถ๋ ฅ. ์ซ์ ์
๋ ฅ->๋ณ ๊ฐ์๋๋ก ๋์ค๋๋ก
let star_image = 'โญ'.repeat(star)
let temp_html = `<div class="col">
<div class="card">
<img src="${image}"
class="card-img-top" alt="...">
<div class="card-body">
<h5 class="card-title">${title}</h5>
<p class="card-text">${desc}</p>
<p>${star_image}</p>
<p class="mycomment">${comment}</p>
</div>
</div>
</div>`
$('#cards-box').append(temp_html)
}
}
})
}
์ ํ๋ก์ ํธ - ์์น๋ฅผ ๋ด๊ฐ ์ํ๋ ํ์ผ์์น๋ก - ๊ธฐ๋ณธ ์ธํฐํ๋ฆฌํฐ๋ 38์ด ๋ค์ด๊ฐ ๊ฒ์ผ๋ก, main.py ์ฐ์ปด ์คํฌ๋ฆฝํธ ์์ฑ ์คํฌ๋ฆฝํธ๋ ํด์
=> ์๋ก ๋ง๋ค๊ธฐ - ํ์ด์ฌ
๋ฌธ๋ฒ (๋ณ์, ์๋ฃํ, ํจ์, ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ)
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฐฐ์ด ๊ฒ๊ณผ ๋น์ทํ๋, ์กฐ๊ธ ๋ ์ง๊ด์
๊ดํธ๋ฅผ ์ด์ฉํด์ ๊ตฌ๋ถํ์ง ์๊ณ :
์ผ๋ก ์ค๋ง์ถค์ผ๋ก ๋ด์ฉ๋ฌผ์ ๊ตฌ๋ถํจ
๋ฐ๋ณต๋ฌธ
- ๋ฆฌ์คํธ ์ด์ฉ
fruits = ['์ฌ๊ณผ','๋ฐฐ','๋ฐฐ','๊ฐ','์๋ฐ','๊ทค','๋ธ๊ธฐ','์ฌ๊ณผ','๋ฐฐ','์๋ฐ']
count = 0
for fruit in fruits:
if fruit == '๋ฐฐ':
count += 1
print(count)
--๊ฒฐ๊ณผ--
3
people = [{'name': 'bob', 'age': 20},
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27}]
//๋ณดํต ๋จ์, ๋ณต์์์ผ๋ก ์ฌ์ฉ
for person in people:
if person['age'] > 20:
print(person['name'])
--๊ฒฐ๊ณผ--
carry
ben
bs4
ํจํค์ง ์ค์น)ํฌ๋กค๋ง ๊ธฐ๋ณธ ์ค๋ํซ
import requests
from bs4 import BeautifulSoup
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'}
//ํ๋จ url๋ง ํ์ํ ๋ ๋ฐ๊ฟ์ฐ๋ฉด ๋จ
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
# ์ฝ๋ฉ ์์
์ธ์ธ ํ์ X ํ์ํ ๋ ๋ณต์ฌํด์ ํ์ํ ๋ถ๋ถ ๊ณ ์ณ์ฐ๊ธฐ
์ค์ต ์ฐธ๊ณ ํ์ด์ง: ๋ค์ด๋ฒ ์ํ ํ์ด์ง
beatiful soup ์ฐ๋ ๋ฐฉ๋ฒ (ํ์ด์ฌ ๋ฌธ๋ฒX)
select_one() : ํ๋๋ง ์ฌ์ฉ
ex) ๋ฐฅ์
title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a ')
print(title.text)
๊ฒฐ๊ณผ -> ๋ฐฅ์
select() : ์ฌ๋ฌ ๊ฐ ์ ํ
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
#old_content > table > tbody > tr:nth-child(4) > td.title > div > a
์ด๋ ๊ฒ #old_content > table > tbody > tr๊น์ง๋ ๊ณตํต๋์๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ์คํํ๋ฉด ๋ฆฌ์คํธ ํํ๋ฅผ ํ์ธํ ์ ์๋ค.
๋ฐ๋ผ์ ๋ฆฌ์คํธ๋๊น, for๋ฌธ์ ๋๋ ค์ค๋ค.
movies = soup.select('#old_content > table > tbody > tr')
for movie in movies:
a = movie.select_one('td.title > div > a')
# none ์ ๊ฐ๋ก์ . ๋ฐ๋ผ์ none์ ์ ์ธํด์ฃผ๊ณ ๊ฐ์ผ ํจ
if a is not None:
print(a.text)
์คํ๊ฒฐ๊ณผ
์ด๋ฐ ์์ผ๋ก ์ํ ์ด๋ฆ์ด ์ญ ๋์จ๋ค!
๋ฐฐ์ด ๊ฒ์ ํ ๋๋ก '์์'์ 'ํ์ '์ ํฌ๋กค๋งํ๊ธฐ
Q. ์๋์ ๊ฐ์ด ๋ณด์ด๋ฉด ์์ฑ!
ํํธ
movie.select_one() ์ด์ฉ!
A. ์์ฑ์ฝ๋
import requests
from bs4 import BeautifulSoup
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)
soup = BeautifulSoup(data.text, 'html.parser')
# ์ฝ๋ฉ ์์
# ๊ณตํต๋ ๋ถ๋ถ
movies = soup.select('#old_content > table > tbody > tr')
for movie in movies:
a = movie.select_one('td.title > div > a')
# none ์ ๊ฐ๋ก์ . ๋ฐ๋ผ์ none์ ์ ์ธํด์ฃผ๊ณ ๊ฐ์ผ ํจ
if a is not None:
# ๋ค๋ฅธ ๋ถ๋ถ ๋ค์ ์๋ ๊ณตํต๋ถ๋ถ ์ ๊ธฐ
title = a.text
rank = movie.select_one('td:nth-child(1) > img')['alt']
star = movie.select_one('td.point').text
print(rank, title, star)
์คํ๊ฒฐ๊ณผ
DB๋ ์ ์ฐ๋ ๊ฒ์ผ๊น?
-> ๋์ค์ ์ ์ฐพ๊ธฐ ์ํด์
(๋ฐฉ ์ ๋ฆฌ ํ๋ ์ด์ , ๊ต๋ณด๋ฌธ๊ณ ์์ ์ฑ
์ด ์ ๋ฆฌ๋๋ ์ด์ ์ ์ผ๋งฅ์ํต)
DB๋ index
๋ก ๋ฐ์ดํฐ๋ค์ด ์ ๋ ฌ๋์ด ์์
DB์ 2๊ฐ์ง ์ข
๋ฅ
1) SQL - ์ ํด์ง ์นธ์ด ์์
์ฅ - ์ ํํ๋์ด ์์, ์ฐพ์ ๋ ๋นจ๋ฆฌ ์ฐพ์ ์ ์์
๋จ - ์ ์ฐํ ๋์ฒ ์ด๋ ค์
2) NoSQL (Not Only SQL)- ์ ํด์ง ์นธ์ด ์์
๊ทธ๋๊ทธ๋๋ง๋ค ์์ -> ์ ์ฐํ ๋์ฒ ๊ฐ๋ฅ (์ด๊ธฐ ์๋น์ค, ์ด๊ธฐ ์คํํธ์
์์ ๋ง์ด ์ฌ์ฉ)
ex) mongoDB
DB๋?
๋ฐ์ดํฐ๋ฅผ ์ ์๊ณ ์ ๊ฐ์ ธ์ค๊ธฐ ์ํ ํ๋ก๊ทธ๋จ
(์์๋ Cloud
ํํ๊ฐ ํธ๋ ๋!)
์์
์์๋ ์ต์ ํด๋ผ์ฐ๋ ์๋น์ค mongoDB Atlas
๋ฅผ ์ฌ์ฉ
์ ์ํ๊ธฐ ์ํด์ ๋๊ฐ์ง ํจํค์ง ํ์!!
pymango, dnspython
pymongo ๊ธฐ๋ณธ์ฝ๋
from pymongo import MongoClient client = MongoClient('์ฌ๊ธฐ์ URL ์ ๋ ฅ') db = client.dbsparta
url์
์ฌ๊ธฐ์ ์๋ url๋ก ์ฐ๊ฒฐํ๋ฉด ๋จ
password๋ ๋ด๊ฐ ์ค์ ํ ๋น๋ฒ์ผ๋ก!
๋ฐ์ดํฐ ๋ค์ด๊ฐ๋์ง ํ์ธํ๋ ๋ฒ
python์์
from pymongo import MongoClient
client = MongoClient('mongodb+srv://minjeong:rPfksakfdl1!@cluster0.mtbw8.mongodb.net/myFirstDatabase?retryWrites=true&w=majority')
db = client.dbsparta
doc = {
'name':'bob',
'age':27
}
db.users.insert_one(doc)
Browse Collectionํด๋ฆญ
์ด๋ ๊ฒ ๊ฒฐ๊ณผ๋ฌผ ํ์ธ์ ํ ์ ์๋ค. users
๋ python์ฝ๋์์ db.users.insert_one(doc)
์ ์๋ users์ ํด๋นํ๋ค.
#'users'๋ผ๋ collection์ {'name':'bobby','age':21}๋ฅผ ๋ฃ์ต๋๋ค.
db.users.insert_one({'name':'bobby','age':21})
db.users.insert_one({'name':'kay','age':27})
db.users.insert_one({'name':'john','age':30})
ํต์์ ์ผ๋ก๋ ์ด๋ ๊ฒ ์
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)
#๋ชจ๋ ๋ฐ์ดํฐ ๋ณด๊ธฐ
from pymongo import MongoClient
client = MongoClient('mongodb+srv://minjeong:rPfksakfdl1!@cluster0.mtbw8.mongodb.net/myFirstDatabase?retryWrites=true&w=majority')
db = client.dbsparta
all_users = list(db.users.find({}))
for user in all_users:
print(user)
๊ฒฐ๊ณผ
#id ์ดํ ๋ถ๋ถ์ ๋์ค์ง ์๋๋ค
all_users = list(db.users.find({},{'_id':False}))
for user in all_users:
print(user)
# ๋ชจ๋ ๋ฐ์ดํฐ ๋ฝ์๋ณด๊ธฐ
all_users = list(db.users.find({},{'_id':False}))
print(all_users[0]) # 0๋ฒ์งธ ๊ฒฐ๊ณผ๊ฐ์ ๋ณด๊ธฐ
print(all_users[0]['name']) # 0๋ฒ์งธ ๊ฒฐ๊ณผ๊ฐ์ 'name'์ ๋ณด๊ธฐ
for user in all_users: # ๋ฐ๋ณต๋ฌธ์ ๋๋ฉฐ ๋ชจ๋ ๊ฒฐ๊ณผ๊ฐ์ ๋ณด๊ธฐ
print(user)
user = db.users.find_one({'name':'bobby'}) print(user)
# ์คํ๊ฐ ๋ง์ผ๋ ์ด ์ค์ ๋ณต์ฌํด์ ์์๋ค! db.users.update_one({'name':'bobby'},{'$set':{'age':19}}) #users์ ๋ค์ด๊ฐ์ ์ ๋ฐ์ดํธ. ์กฐ๊ฑด : name์ด bobby๋ฅผ ๋ฐ๊ฟ. set : age๋ฅผ 19๋ก ๋ณ๊ฒฝํ๋ผ user = db.users.find_one({'name':'bobby'}) print(user)
db.users.delete_one({'name':'bobby'})
user = db.users.find_one({'name':'bobby'})
print(user)
# ์ ์ฅ - ์์
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'})
import requests
from bs4 import BeautifulSoup
#๐db์ฐ๊ฒฐํ๊ธฐ!
from pymongo import MongoClient
client = MongoClient('mongodb+srv://minjeong:rPfksakfdl1!@cluster0.mtbw8.mongodb.net/myFirstDatabase?retryWrites=true&w=majority')
db = client.dbsparta
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)
soup = BeautifulSoup(data.text, 'html.parser')
# ์ฝ๋ฉ ์์
# ๊ณตํต๋ ๋ถ๋ถ
movies = soup.select('#old_content > table > tbody > tr')
for movie in movies:
a = movie.select_one('td.title > div > a')
# none ์ ๊ฐ๋ก์ . ๋ฐ๋ผ์ none์ ์ ์ธํด์ฃผ๊ณ ๊ฐ์ผ ํจ
if a is not None:
# ๋ค๋ฅธ ๋ถ๋ถ ๋ค์ ์๋ ๊ณตํต๋ถ๋ถ ์ ๊ธฐ
title = a.text
rank = movie.select_one('td:nth-child(1) > img')['alt']
star = movie.select_one('td.point').text
#๐10~13๊ฐ์์ ๋ฐฐ์ ๋ ๋ถ๋ถ์ ํ ๋๋ก, doc์์ฑ!!
doc = {
'title':title,
'rank':rank,
'star':star
}
db.movies.insert_one(doc)
์งํ์ฌํญ๊ณผ ์๊ด์์ด ํ๋ฒ ๋ ๋ค์ ๋ค์ด์ ํผ์ ์ค์ตํด๋ด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค...
3๋ฒ
๐ ์ง๋๋ฎค์ง์ 1~50์ ๊ณก์ ์คํฌ๋ํ ํด๋ณด์ธ์.
์ง๋๋ฎค์ง์ฌ์ดํธ ๋ฐ๋ก๊ฐ๊ธฐ
์ด๋ ๊ฒ ๋๋ฉด ์์ฑ์
ํํธ
0) ์ถ๋ ฅ ํ ๋๋ print(rank, title, artist) ํ๋ฉด ๋ฉ๋๋ค!
1) ์์์ ๋ ๊ธ์๋ง ๋๊ธฐ! text[0:2] ๋ฅผ ์จ๋ณด์ธ์!
2) ์์์ ๊ณก์ ๋ชฉ์ด ๊น๋ํ๊ฒ ๋์ค์ง ์์ ๊ฑฐ์์. ์์ ์ฌ๋ฐฑ์ด ์๋ค๋๊ฐ, ๋ค๋ฅธ ๊ธ์จ๋ ๋์จ๋ค๋๊ฐ.. ํ์ด์ฌ ๋ด์ฅ ํจ์์ธ strip()์ ์ ์ฐ๊ตฌํด๋ณด์ธ์!
import requests
from bs4 import BeautifulSoup
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://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20210701',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
# ์ฝ๋ ์์
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number
#body-content > div.newest-list > div > table > tbody > tr:nth-child(2) > td.number
musics = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
for music in musics:
# ๋ค๋ฅธ ๋ถ๋ถ ๋ค์ ์๋ ๊ณตํต๋ถ๋ถ ์ ๊ธฐ
rank = music.select_one('td.number').text[0:2].strip()
title = music.select_one('td.info > a.title.ellipsis').text.strip()
artist = music.select_one('td.info > a.artist.ellipsis').text
print(rank, title, artist)
์์ฐฌ ์์ ์ ๋๋ค! ์น ๊ฐ๋ฐ์ ํ์ํ FE๋ถ๋ถ๊ณผ BE๋ถ๋ถ์ ์กฐ๊ธ์ด๋ผ๋ ๋ค๋ค์ ๋ง์กฑ์ค๋ฝ์ต๋๋ค.
๋์ ๋ฒ์๋ฅผ ์ข๊ฒ ๋ฐฐ์ฐ๋ ๋๋์ ๋๋ค! ๋๊ฒ ๊ณจ๊ณ ๋ฃจ ๋ฐฐ์ฐ๋ ๊ฑด ์ข์ง๋ง, ์ตํ๋ ์๊ฐ์ด ํจ์ฌ ์งง๊ฒ ๋๊ปด์ง๋๋ค. ์ฐ์ต๋ฌธ์ ๋ฅผ ๋ ์ฃผ๊ฑฐ๋ ์๋๋ฉด ๊ฐ์๋ฅผ ๋ ์ค๋ ์๊ฐ ๋ณผ ์ ์๋๋ก ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
1. ํ์ด์ฌ
ํ๊ต ์์
์์ ๋ฐฐ์ด ํ์ด์ฌ๊ณผ๋ ๋ค๋ฅด๊ฒ ์ค์ ์์ ๋ฐฐ์ฐ๋ ๊ฑฐ๋ฅผ ๋ฐ๋ก ์ ํ ๋๋์ด๋ผ ์ข์๋ค. ํผ์์ ์นํ์ด์ง๋ฅผ ๋ง๋ค ๋๋ ์ด๋ค ํจํค์ง๋ฅผ ์จ์ผ ํ ์ง ๋ค์ ๋ง๋งํ ๊ฒ ๊ฐ์ง๋ง ๊ทธ๋๋ '์ด๋ฐ ์์ผ๋ก ํ๋ ๊ฑฐ๊ตฌ๋'๋ฅผ ๋ง์ด ๋๊ผ๋ค. ์ด๋ฐ ๊ฐ ์กฐ์ฐจ ์์๊ธฐ์ ์๋ก์์ ์ข์๋ค.
๋๋ฆ ํ๊ต์์ ์์
๋ค์๋ค๊ณ ์๋งํ๊ณ ์์๋๋ฐ ๋ค ๋ชจ๋ฅด๋ ๋ถ๋ถ์ด๋ผ์ ๋ฐ๋ผ๊ฐ๊ธด ํ๋ค์์ง๋ง ์ ์ตํ๋ ๊ฒ ๊ฐ๋ค.
ํ์ด์ฌ ๋ฆฌ๋ง์ธ๋ : ํฌ๋กค๋ง
๋์๊ฒ ๋ค์ ์ด๋ ค์ด ๊ฐ๋
์ด๋ผ ์ฌ๋ฌ๋ฒ ๋ฐ๋ณตํด์ผ ํ ๊ฒ ๊ฐ๋ค!
select(), select_one()
2. DB
mongoDB ๊น๋ ๋ถ๋ถ๋ถํฐ ์ ๋จน์๋ค. ๊ฐ์๊ฐ ์์ ๋ฒ์ ์ด๋ผ์ ์ด๋ป๊ฒ ํด์ผ ํ ์ง ๊ฐ์ด ์ ์์ ์๊ฐ์ด ๊ฝค ์ค๋ ๊ฑธ๋ ธ๋ค.
๊ทธ๋๋ ์ด์ฐ์ ์ฐ,,, ๊ฐ์๋๋ก ๋ฐ๋ผ๊ฐ๊ธด ํ๋ค. ์ด๋ฐ ๊ฒ ์จ๋ผ์ธ์์
์ ๋จ์ ์ธ ๊ฒ ๊ฐ๋ค. ๋ฐ๋ก๋ฐ๋ก ์ง๋ฌธ์ ํ ์ ์๋ ๊ฒ. ์ง๋ฌธํด๋ ๋ต๋ณ์ ๊ธฐ๋ค๋ ค์ผ ํ๋ ๊ฒ.
๋์ค์๋ mongoDB๋ฅผ ํ์ฉํ ์ ์์ผ๋ ค๋?
mongoDB ๋ฆฌ๋ง์ธ๋ : 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'})
์ฌ์ฉํ ๋ DB์ ์ด๋ ์์น์ ์๋์ง ๊ผญ ํ์ธํ ๊ฒ!
3. ๊ณผ์
ํฌ๋กค๋งํ๋ ๊ณผ์ ์๋ค. ์์ DB๋ฐฐ์ด๋ค๊ณ ๋ค ๊น๋จน์์ด์ ๋ง๋งํ๋ค. ์ ์ ํ๋ hello.py
๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
๊ฐ์ ๋ฃ๊ณ ๋ฐ๋ผํ ๋๋ ๋ชจ๋ฅด๋๋ฐ, ์ง์ ํด๋ณด๋ฉด ๋ ๋ง์ด ๋ฐฐ์ ๊ฐ๋ ๊ฒ ๊ฐ๋ค.