⭐ 이번 프로젝트에서 배울 내용
Flask
프레임워크를 활용해 API를 만들 수 있다버킷리스트
프로젝트를 생성해 API를 만들고 클라이언트에 연결한다팬명록
프로젝트를 생성해 API를 만들고 클라이언트에 연결한다AWS Elastic Beanstalk
으로 직접 만든 웹 서비스를 배포한다
1) AWS 루트계정 가입하기
AWS 사이트 바로가기
처음 사이트에 가면 위 화면처럼 나오는데 가입할 이메일, 이름 작성하고 아래 주황색 버튼 눌러주기
그럼 위 화면이 나오는데 작성했던 이메일 주소 메일에 들어가서 verification code 작성하고 5단계정도 쭉 회원가입 하면 된다 !
회원가입이 완료되면 위 창이 뜨는 Root user 선택하고 가입했던 이메일 쓰고 Next 버튼 누르면 Password 기입 창이 나오는데 pw까지 다 치고 아래 창까지 나오면 AWS 준비 완료.
Terminal > New Terminal
python -m venv venv
입력 후 엔터venv
선택venv
라고 뜨면 활성화 완료flask
, pymongo
, dnspython
pip install flask pymongo dnspython
터미널 에 쳐서 패키지 설치하기
from flask import Flask, render_template, request, jsonify
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html')
@app.route("/bucket", methods=["POST"])
def bucket_post():
sample_receive = request.form['sample_give']
print(sample_receive)
return jsonify({'msg': 'POST 연결 완료!'})
@app.route("/bucket", methods=["GET"])
def bucket_get():
return jsonify({'msg': 'GET 연결 완료!'})
if __name__ == '__main__':
app.run('0.0.0.0', port=5000, debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<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>
<link
href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap"
rel="stylesheet"
/>
<title>인생 버킷리스트</title>
<style>
* {
font-family: "Gowun Dodum", sans-serif;
}
.mypic {
width: 100%;
height: 200px;
background-image: linear-gradient(
0deg,
rgba(0, 0, 0, 0.5),
rgba(0, 0, 0, 0.5)
),
url("https://images.unsplash.com/photo-1601024445121-e5b82f020549?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=1189&q=80");
background-position: center;
background-size: cover;
color: white;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.mypic > h1 {
font-size: 30px;
}
.mybox {
width: 95%;
max-width: 700px;
padding: 20px;
box-shadow: 0px 0px 10px 0px lightblue;
margin: 20px auto;
}
.mybucket {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
}
.mybucket > input {
width: 70%;
}
.mybox > li {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
margin-bottom: 10px;
min-height: 48px;
}
.mybox > li > h2 {
max-width: 75%;
font-size: 20px;
font-weight: 500;
margin-right: auto;
margin-bottom: 0px;
}
.mybox > li > h2.done {
text-decoration: line-through;
}
</style>
<script>
$(document).ready(function () {
show_bucket();
});
function show_bucket() {
fetch('/bucket').then(res => res.json()).then(data => {
// console.log(data)
})
}
function save_bucket() {
let formData = new FormData();
formData.append("sample_give", "샘플데이터");
fetch('/bucket', {method: "POST",body: formData,}).then((response) => response.json()).then((data) => {
alert(data["msg"]);
window.location.reload();
});
}
</script>
</head>
<body>
<div class="mypic">
<h1>나의 버킷리스트</h1>
</div>
<div class="mybox">
<div class="mybucket">
<input
id="bucket"
class="form-control"
type="text"
placeholder="이루고 싶은 것을 입력하세요"
/>
<button onclick="save_bucket()" type="button" class="btn btn-outline-primary">기록하기</button>
</div>
</div>
<div class="mybox" id="bucket-list">
<li>
<h2>✅ 호주에서 스카이다이빙 하기</h2>
<button onclick="done_bucket(5)" type="button" class="btn btn-outline-primary">완료!</button>
</li>
<li>
<h2 class="done">✅ 호주에서 스카이다이빙 하기</h2>
</li>
<li>
<h2>✅ 호주에서 스카이다이빙 하기</h2>
<button type="button" class="btn btn-outline-primary">완료!</button>
</li>
</div>
</body>
</html>
mongoDB 창까지 띄워주면 뼈대 준비는 완료 !!
연결이 잘 되어있는지 확인해보자. localhost:5000
들어가서 기록하기 버튼을 누르면 POST 연결 완료! 라는 alert 창이 뜨는 것을 확인할 수 있다.
$(document).ready(function () {
show_bucket();
});
우선 페이지 로딩이 완료되면 show_bucket()
이 호출된다.
function show_bucket() {
fetch('/bucket').then(res => res.json()).then(data => {
console.log(data)
alert(data['msg'])
})
}
show_bucket
함수는 /bucket
API에 요청을 전송(fetch)함. 전송한 내용을 받아와서 data에 저장하고 console에 나타내고 msg 값을 받아와서 alert창으로 띄운다. /bucket
으로 가보자.
@app.route("/bucket", methods=["GET"])
def bucket_get():
return jsonify({'msg': 'GET 연결 완료!'})
msg
를 보면 'GET 연결 완료!' 라는 메세지를 내려주고 있다. 그럼 이게 alert 창에 표시되겠지.
<button onclick="save_bucket()" type="button" class="btn btn-outline-primary">기록하기</button>
save_bucket() 함수를 가지는 기록하기 버튼을 보면 onclick 즉 버튼을 누르면 save_bucket()
함수가 호출된다. save_bucket 함수를 보면
function save_bucket() {
let formData = new FormData();
formData.append("sample_give", "샘플데이터");
fetch('/bucket', {method: "POST",body: formData,}).then((response) => response.json()).then((data) => {
alert(data["msg"]);
window.location.reload();
});
}
sample_give
라는 이름으로 formData에 저장하고 fetch('/bucket', {method: "POST",body: formData,})
를 보면 "샘플데이터"를 담아서 /bucket에다 보내는 것을 확인할 수 있다.
@app.route("/bucket", methods=["POST"])
def bucket_post():
sample_receive = request.form['sample_give']
print(sample_receive)
return jsonify({'msg': 'POST 연결 완료!'})
app.py
에서 /bucket
부분을 보면 sample_give
데이터를 찾아서(request) sample_receive
변수에 저장하고 print한 뒤 'msg': 'POST 연결 완료!'
메세지를 내려주게 되어 있는 구조. 그럼 이 메세지를 출력하는 구간은
function save_bucket() {
let formData = new FormData();
formData.append("sample_give", "샘플데이터");
fetch('/bucket', {method: "POST",body: formData,}).then((response) => response.json()).then((data) => {
alert(data["msg"]); //여기
window.location.reload();
});
}
index.html
에 msg를 alert하는 코드에서 출력된다.
1) 데이터 명세
/bucket
, 요청 방식 = POST
bucket
2) 서버 만들기
데이터베이스에 연결부터 해야하니까 이전에 썼던 dbprac.py
파일을 열어서
from pymongo import MongoClient
client = MongoClient('내 URL')
db = client.dbsparta
db랑 연결해줄 코드를 복사해서 URL은 내 mongoDB URL을 넣으면 된다. 붙여넣어주고,
# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)
저장할 때 사용할 코드 복사해서 변형해준다.
@app.route("/bucket", methods=["POST"])
def bucket_post():
bucket_receive = request.form['bucket_give']
doc = {
'bucket' : bucket_receive
}
db.bucket_list.insert_one(doc)
return jsonify({'msg': 'POST 연결 완료!'})
이렇게 하면 끝 ! 백엔드는 끝났으니 프론트 코드 수정하기. 이건 html 파일에서 !
function save_bucket() {
let formData = new FormData();
formData.append("sample_give", "샘플데이터");
fetch('/bucket', {method: "POST",body: formData,}).then((response) => response.json()).then((data) => {
alert(data["msg"]);
window.location.reload();
});
}
3) 클라이언트 만들기
이 save_bucket 코드를 수정하면 되는데 데이터를 어디서 읽어와야 하니
<div class="mybucket">
<input
id="bucket"
class="form-control"
type="text"
placeholder="이루고 싶은 것을 입력하세요"
/>
<button onclick="save_bucket()" type="button" class="btn btn-outline-primary">기록하기</button>
</div>
입력받는 input 태그의 데이터를 가져오면 되니까 id=bucket
사용해서
function save_bucket() {
let bucket = $('#bucket').val();
let formData = new FormData();
formData.append("bucket_give", bucket);
fetch('/bucket', {method: "POST",body: formData,}).then((response) => response.json()).then((data) => {
alert(data['msg']);
window.location.reload();
});
}
let bucket = $('#bucket').val();
제이쿼리 사용해서 id가 bucket인 부분의 val, 값을 bucket이라는 변수에 넣고, 변수를 formData.append("bucket_give", bucket);
bucket_give 자리에 bucket 값을 주게 코드 수정하고
return jsonify({'msg': '버킷리스트 추가 완료 !'})
app.py
파일에서 POST 코드에서 msg 내용을 버킷리스트 추가 완료로 바꿔줬다. 이제 버킷리스트를 작성하고 기록하기 버튼을 누르면 버킷리스트 추가 완료 ! 라는 alert 창이 뜨게 된다.
alert 창이 잘 뜨는 것까지 확인 !
1) 데이터 명세
/bucket
, 요청 방식 = GET
2) 서버 만들기
따로 받을 것 없이 값을 전송해주기만 하면 된다.
# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))
위 코드 수정해서 아래처럼 코드 작성했다.
@app.route("/bucket", methods=["GET"])
def bucket_get():
bucket_list = list(db.bucket_list.find({},{'_id':False}))
#return jsonify({'msg': 'GET 연결 완료!'})
return jsonify({'result': bucket_list})
bucket_list = list(db.bucket_list.find({},{'_id':False}))
이렇게 찾아낸 데이터들을 보여줘야 하는데 'msg': 'GET 연결 완료!'가 아니라 result 값으로 bucket_list를 전송해주면 된다.
이제 html에 append하는 방법은
function show_bucket() {
fetch('/bucket').then(res => res.json()).then(data => {
console.log(data)
alert(data['msg']);
})
}
이 코드에서 수정하면 되는데, console과 alert코드 지우고
function show_bucket() {
fetch('/bucket').then(res => res.json()).then(data => {
let rows = data['result'];
console.log(rows)
});
})
}
data에서 위에 {'result': bucket_list}
이 값을 받아오면 된다. 이걸 rows 라는 변수에 할당하고 console 창에서 출력해보면 리스트 형태로 들어가있는 것을 확인할 수 있다. 반복문 사용해서 html에 append하면 될 듯 !
rows.forEach((wish) => {
let bucket = wish['bucket']
let temp_html = `<li>
<h2>${bucket}</h2>
<button type="button" class="btn btn-outline-primary">완료!</button>
</li>`
});
rows 를 돌리면서 반목문 작성하는데 이 요소 하나를 wish라고 썼다. rows 리스트 안에 wish 요소의 bucket값을 bucket 이라는 변수에 할당해주고 temp_html 변수 만들어서 append 할 내용을 적어줬다. 이제 이 내용을 어디에 붙일지 살펴보면 아래 div 태그 안에 li 태그로 쭉 작성되있는 걸 확인할 수 있다. id="bucket-list"
써서
<div class="mybox" id="bucket-list">
<li>
<h2>✅ 호주에서 스카이다이빙 하기</h2>
<button onclick="done_bucket(5)" type="button" class="btn btn-outline-primary">완료!</button>
</li>
<li>
<h2 class="done">✅ 호주에서 스카이다이빙 하기</h2>
</li>
<li>
<h2>✅ 호주에서 스카이다이빙 하기</h2>
<button type="button" class="btn btn-outline-primary">완료!</button>
</li>
</div>
$('#bucket-list').append(temp_html);
id가 bucket-list 인 곳에 temp_html을 append 한다는 코드를 작성해줬다.
function show_bucket() {
fetch('/bucket').then(res => res.json()).then(data => {
let rows = data['result'];
$('#bucket-list').empty(); //기존 코드 삭제
rows.forEach((wish) => {
let bucket = wish['bucket'];
let temp_html = `<li>
<h2>${bucket}</h2>
<button type="button" class="btn btn-outline-primary">완료!</button>
</li>`
$('#bucket-list').append(temp_html); //append
});
})
}
rows 반복문이 돌기 전에 bucket-list id를 가진 부분을 empty() 삭제해주고 $('#bucket-list').append(temp_html);
append 하면 완료 !