2023.01.26 개발일지 - 버킷리스트

클로이🖤·2023년 1월 26일
0

Web-developer

목록 보기
22/22
post-thumbnail

버킷리스트 사이트 만들기

⭐ 이번 프로젝트에서 배울 내용

  1. Flask 프레임워크를 활용해 API를 만들 수 있다
  2. 버킷리스트 프로젝트를 생성해 API를 만들고 클라이언트에 연결한다
  3. 팬명록 프로젝트를 생성해 API를 만들고 클라이언트에 연결한다
  4. AWS Elastic Beanstalk으로 직접 만든 웹 서비스를 배포한다

01. AWS 가입하기 및 보안 설정하기

1) AWS 루트계정 가입하기

AWS 사이트 바로가기


처음 사이트에 가면 위 화면처럼 나오는데 가입할 이메일, 이름 작성하고 아래 주황색 버튼 눌러주기


그럼 위 화면이 나오는데 작성했던 이메일 주소 메일에 들어가서 verification code 작성하고 5단계정도 쭉 회원가입 하면 된다 !
업로드중..
회원가입이 완료되면 위 창이 뜨는 Root user 선택하고 가입했던 이메일 쓰고 Next 버튼 누르면 Password 기입 창이 나오는데 pw까지 다 치고 아래 창까지 나오면 AWS 준비 완료.
업로드중..

가상환경 생성

  • 화면 상단 Terminal > New Terminal
  • python -m venv venv 입력 후 엔터
  • 화면 오른쪽 하단 python 버전 선택 -> venv 선택
  • 새 터미널 생성 -> venv 라고 뜨면 활성화 완료

패키지 설치

  • 이번에 필요한 패키지는 3개 : flask, pymongo, dnspython

pip install flask pymongo dnspython 터미널 에 쳐서 패키지 설치하기

업로드중..

app.py 뼈대 준비

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)

index.html 뼈대 준비

<!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하는 코드에서 출력된다.

버킷리스트 - POST 연습하기

  1. API 만들고 사용하기 - 버킷리스트 기록 API(Create→POST)

1) 데이터 명세

  • 요청 정보 : URL= /bucket, 요청 방식 = POST
  • 클라(fetch) → 서버(flask) : bucket
  • 서버(flask) → 클라(fetch) : 메시지를 보냄 (버킷리스트 저장 완료!)

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 창이 잘 뜨는 것까지 확인 !

버킷리스트 - GET 연습하기 (버킷리스트 보여주기)

  1. API 만들고 사용하기 - 버킷리스트 조회 API(Read→GET)

1) 데이터 명세

  • 요청 정보 : URL= /bucket, 요청 방식 = GET
  • 클라(fetch) → 서버(flask) : 없음
  • 서버(flask) → 클라(fetch) : 전체 버킷을 보여주기

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 하면 완료 !

profile
front-end developer

0개의 댓글