본문 바로가기

Web development

[프로젝트] 팬명록 만들기

01. [팬명록] - 프로젝트 세팅

sparta → proejcts → 05.fan 폴더에서 시작!

1) 문제 분석 - 완성작 보기 :  http://myweb.eba-e3azqkqv.ap-northeast-2.elasticbeanstalk.com/

2) 프로젝트 세팅 - Flask 폴더 구조 만들기

3) 가상환경 생성, 패키지 설치하기

   (1) 가상환경 생성, 활성화

# Flask : 만들 프로젝트의 폴더 구조 정해져 있음

 

05. fan 폴더 구조

05. FAN

[파일]  |—app.py(서버)   

> Terminal > New Terminal > python(맥 python3) -m venv venv > 아래 파이썬 버전 venv > 터미널 끄고 새로 켜기

           |— venv

[폴더]  |— templates

[파일]      |— index.html (클라이언트 파일)

 

  (2) (새터미널에)패키지 설치 

pip install flask pymongo dnspython

 

4) 프로젝트 준비하기

[팬명록 뼈대 코드 - app.py]

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

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

@app.route("/guestbook", methods=["POST"])
def guestbook_post():
    sample_receive = request.form['sample_give']
    print(sample_receive)
    return jsonify({'msg': 'POST 연결 완료!'})

@app.route("/guestbook", methods=["GET"])
def guestbook_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
      rel="stylesheet"
      integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC"
      crossorigin="anonymous"
    />
    <script
      integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
      crossorigin="anonymous"
    ></script>

    <title>초미니홈피 - 팬명록</title>

    <link
      rel="stylesheet"
    />
    <style>
      * {
        font-family: "Noto Serif KR", serif;
      }
      .mypic {
        width: 100%;
        height: 300px;

        background-image: linear-gradient(
            0deg,
            rgba(0, 0, 0, 0.5),
            rgba(0, 0, 0, 0.5)
          ),
        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 > button {
        margin-top: 15px;
      }

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

      .mycards > .card {
        margin-top: 10px;
        margin-bottom: 10px;
      }
    </style>
    <script>
      $(document).ready(function () {
        set_temp();
        show_comment();
      });
      function set_temp() {
        fetch("http://spartacodingclub.shop/sparta_api/weather/seoul").then((res) => res.json()).then((data) => {
                        console.log(data)
          });
      }
      function save_comment() {
        let formData = new FormData();
        formData.append("sample_give", "샘플데이터");

        fetch('/guestbook', {method: "POST",body: formData,}).then((res) => res.json()).then((data) => {
            //console.log(data)
            alert(data["msg"]);
          });
      }
      function show_comment() {
        fetch('/guestbook').then((res) => res.json()).then((data) => {
                        alert(data["msg"])
                })
      }
    </script>
  </head>
  <body>
    <div class="mypic">
      <h1>십센치(10cm) 팬명록</h1>
      <p>현재기온: <span id="temp">36</span></p>
    </div>
    <div class="mypost">
      <div class="form-floating mb-3">
        <input type="text" class="form-control" id="name" placeholder="url" />
        <label for="floatingInput">닉네임</label>
      </div>
      <div class="form-floating">
        <textarea
          class="form-control"
          placeholder="Leave a comment here"
          id="comment"
          style="height: 100px"
        ></textarea>
        <label for="floatingTextarea2">응원댓글</label>
      </div>
      <button onclick="save_comment()" type="button" class="btn btn-dark">
        댓글 남기기
      </button>
    </div>
    <div class="mycards" id="comment-list">
      <div class="card">
        <div class="card-body">
          <blockquote class="blockquote mb-0">
            <p>새로운 앨범 너무 멋져요!</p>
            <footer class="blockquote-footer">호빵맨</footer>
          </blockquote>
        </div>
      </div>
      <div class="card">
        <div class="card-body">
          <blockquote class="blockquote mb-0">
            <p>새로운 앨범 너무 멋져요!</p>
            <footer class="blockquote-footer">호빵맨</footer>
          </blockquote>
        </div>
      </div>
      <div class="card">
        <div class="card-body">
          <blockquote class="blockquote mb-0">
            <p>새로운 앨범 너무 멋져요!</p>
            <footer class="blockquote-footer">호빵맨</footer>
          </blockquote>
        </div>
      </div>
    </div>
  </body>
</html>

5) 프로젝트 준비 - mongoDB Atlas 창 띄워두기

 

02. [팬명록] - 조각기능. 날씨 API 적용하기

   1) OpenAPI(서울 날씨 OpenAPI)를 활용해 조각기능 구현하기

[ index.html 날씨 OpenAPI 뼈대 코드]

<script>
        $(document).ready(function () {
            set_temp();
            show_comment();
        });
        function set_temp() {
            fetch("http://spartacodingclub.shop/sparta_api/weather/seoul").then((res) => res.json()).then((data) => {
                console.log(data)
            });
        }

1) 데이터명세

2) 클라이언트와 서버 연결 확인하기

[index.html]

<script>
        $(document).ready(function () {
            set_temp();
            show_comment();
        });
        function set_temp() {
            fetch("http://spartacodingclub.shop/sparta_api/weather/seoul").then((res) => res.json()).then((data) => {
                console.log(data)
            });
        }

# 검색 > 개발자 도구를 열어 console.log()  접속 데이터 잘 붙어서 오는지 확인!

3) 만들어진 서버 가져오기

# OpenAPI는 이미 데이터베이스가 구축된 서버이기 때문에 OpenAPI를 가져다가 보여줄 클라이언트만 만들면 됨

 

4) 클라이언트 만들기

가져온 데이터를 temp_html로 뼈대에 담아 제이쿼리로 append 해주기

function set_temp() {
            fetch("http://spartacodingclub.shop/sparta_api/weather/seoul").then((res) => res.json()).then((data) => {
                let temp = data['temp']
                $('#temp').text(temp)
            });

5) 확인하기

 - 동작 테스트: 화면 새로고침 > DB에 저장된 리뷰 화면 나오는지 확인!

 

 

03. [팬명록] - POST 연습하기(응원 등록하기)

#  API 만들고 사용하기 - 응원 게시하기 API (Create→POST : 데이터 생성)

1) 데이터명세

1.요청정보 : URL = /guestbook, 요청방식 = POST

2.클라(fetch) → 서버(flask) : name, comment

3.서버(flask) → 클라(fetch) : 메시지를 보냄 (응원 완료!)

2) 클라이언트와 서버 연결 확인하기

[서버 코드 - app.py]

@app.route("/guestbook", methods=["POST"])
def guestbook_post():
    name_receive = request.form['name_give']
    comment_receive = request.form['comment_give']
    print(name_receive, comment_receive)    
    return jsonify({'msg': '저장 완료!'})

[클라이언트 코드 - index.html]

 function save_comment() {
            let formData = new FormData();
            formData.append("name_give", name);
            formData.append("comment_give", comment);

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

3) 서버부터 만들기

dbprac.py 에서 코드 불러오기 > app.py를 데이터베이스 연결

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.kjechbb.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

(1) name, comment 정보를 받아서, 저장

 formData.append("name_give", name);

formData.append("comment_give", comment)

(2) 잘 입력되었는지 확인하기 위해 메시지 변경해보기

@app.route("/guestbook", methods=["POST"])
def guestbook_post():
    name_receive = request.form['name_give']
    comment_receive = request.form['comment_give']
   
    doc = {
        'name':name_receive,
        'comment':comment_receive
    }
    db.fan.insert_one(doc)
   
    return jsonify({'msg': '저장 완료!'})

4) 클라이언트 만들기

name, comment 정보 보내주기 > formData 데이터 넣고 window.location.reload() > 저장 > 새로고침 > 확인

function save_comment() {
            let name = $('#name').val()
            let comment = $('#comment').val()

            let formData = new FormData();
            formData.append("name_give", name);
            formData.append("comment_give", comment);

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

5) 확인하기

데이터 입력 > DB 확인

04. [팬명록] - GET (응원 보여주기)

#  API 만들고 사용하기 - 버킷리스트 조회 API(Read→GET : 데이터 조회)

1) 데이터 명세

1. 요청 정보 : URL= /guestbook, 요청 방식 = GET

2. 클라(fetch) → 서버(flask) : 없음

3. 서버(flask) → 클라(fetch) : 전체 응원 목록을 보여주기

2) 클라이언트와 서버 연결 확인하기

[서버 코드 - app.py]

@app.route("/guestbook", methods=["GET"])
def guestbook_get():
    return jsonify({'result': all_comments})

[클라이언트 코드 - index.html]

<script>
        $(document).ready(function () {
            set_temp();
            show_comment();
        });
       
       function show_comment() {
            fetch('/guestbook').then((res) => res.json()).then((data) => {
                console.log(data)
                alert(data['msg'])
                let rows = data['result']
            })
        }

3) 서버부터 만들기

- 받을 것 없이 fanname, comment를 담아서 내려주기

@app.route("/guestbook", methods=["GET"])
def guestbook_get():
    all_comments = list(db.fan.find({},{'_id':False}))
    return jsonify({'result': all_comments})

4) 클라이언트 만들기

  (1) 응원 목록을 forEach문으로 반복하면서 데이터를 뽑아주기

  (2) 가져온 데이터를 temp_html로 뼈대에 데이터를 담아 제이쿼리로 append

  (3) 기존 html 코드들을 지워줄 수 있도록 empty()

function show_comment() {
            fetch('/guestbook').then((res) => res.json()).then((data) => {
                let rows = data['result']
                $('#comment-list').empty()
                rows.forEach((a)=>{
                    let name = a['name']
                    let comment = a['comment']

                    let temp_html = `<div class="card">
                                        <div class="card-body">
                                            <blockquote class="blockquote mb-0">
                                                <p>${comment}</p>
                                                <footer class="blockquote-footer">${name}</footer>
                                            </blockquote>
                                        </div>
                                    </div>`
                    $('#comment-list').append(temp_html)
                })
            })
        }

5) 확인하기

동작 테스트: 화면 새로고침 > DB 저장된 리뷰 > 화면에 나타나는지 확인

# 전체 완성 코드 확인하기

[코드] app.py - 팬명록 서버

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

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.kjechbb.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

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

@app.route("/guestbook", methods=["POST"])
def guestbook_post():
    name_receive = request.form['name_give']
    comment_receive = request.form['comment_give']
   
    doc = {
        'name':name_receive,
        'comment':comment_receive
    }
    db.fan.insert_one(doc)
   
    return jsonify({'msg': '저장 완료!'})

@app.route("/guestbook", methods=["GET"])
def guestbook_get():
    all_comments = list(db.fan.find({},{'_id':False}))
    return jsonify({'result': all_comments})

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" />

        integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous" />
        integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
        crossorigin="anonymous"></script>

    <title>초미니홈피 - 응원 댓글창</title>

    <meta property="og:title" content="항해99 응원 댓글창" />
    <meta property="og:description" content="나 자신에게 응원 한마디!" />

        rel="stylesheet" />
    <style>
        * {
            font-family: "Noto Serif KR", serif;
        }

        .mypic {
            width: 100%;
            height: 300px;

            background-image: linear-gradient(0deg,
                    rgba(0, 0, 0, 0.5),
                    rgba(0, 0, 0, 0.5)),
            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>button {
            margin-top: 15px;
        }

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

        .mycards>.card {
            margin-top: 10px;
            margin-bottom: 10px;
        }
    </style>
    <script>
        $(document).ready(function () {
            set_temp();
            show_comment();
        });
        function set_temp() {
            fetch("http://spartacodingclub.shop/sparta_api/weather/seoul").then((res) => res.json()).then((data) => {
                let temp = data['temp']
                $('#temp').text(temp)
            });
        }
        function save_comment() {
            let name = $('#name').val()
            let comment = $('#comment').val()

            let formData = new FormData();
            formData.append("name_give", name);
            formData.append("comment_give", comment);

            fetch('/guestbook', { method: "POST", body: formData, }).then((res) => res.json()).then((data) => {
                alert(data["msg"]);
                window.location.reload()
            });
        }
        function show_comment() {
            fetch('/guestbook').then((res) => res.json()).then((data) => {
                let rows = data['result']
                $('#comment-list').empty()
                rows.forEach((a)=>{
                    let name = a['name']
                    let comment = a['comment']

                    let temp_html = `<div class="card">
                                        <div class="card-body">
                                            <blockquote class="blockquote mb-0">
                                                <p>${comment}</p>
                                                <footer class="blockquote-footer">${name}</footer>
                                            </blockquote>
                                        </div>
                                    </div>`
                    $('#comment-list').append(temp_html)
                })
            })
        }
    </script>
</head>

<body>
    <div class="mypic">
        <h1>항해99 응원 댓글창</h1>
        <p>현재기온: <span id="temp">36</span></p>
    </div>
    <div class="mypost">
        <div class="form-floating mb-3">
            <input type="text" class="form-control" id="name" placeholder="url" />
            <label for="floatingInput">닉네임</label>
        </div>
        <div class="form-floating">
            <textarea class="form-control" placeholder="Leave a comment here" id="comment"
                style="height: 100px"></textarea>
            <label for="floatingTextarea2">응원댓글</label>
        </div>
        <button onclick="save_comment()" type="button" class="btn btn-dark">
            댓글 남기기
        </button>
    </div>
    <div class="mycards" id="comment-list">
        <div class="card">
            <div class="card-body">
                <blockquote class="blockquote mb-0">
                    <p>새로운 앨범 너무 멋져요!</p>
                    <footer class="blockquote-footer">호빵맨</footer>
                </blockquote>
            </div>
        </div>
        <div class="card">
            <div class="card-body">
                <blockquote class="blockquote mb-0">
                    <p>새로운 앨범 너무 멋져요!</p>
                    <footer class="blockquote-footer">호빵맨</footer>
                </blockquote>
            </div>
        </div>
        <div class="card">
            <div class="card-body">
                <blockquote class="blockquote mb-0">
                    <p>새로운 앨범 너무 멋져요!</p>
                    <footer class="blockquote-footer">호빵맨</footer>
                </blockquote>
            </div>
        </div>
    </div>
</body>

</html>

 

05. og 태그 만들기

# (스파르타피디아에서 배웠던) og:image, og:title, og:description 태그

# index.html > <title>과 <link href=""> 사이에 아래 내용을 작성하면 og 태그를 개인 프로젝트에 사용할 수 있음

<meta property="og:title" content="항해99 응원 댓글창" />
<meta property="og:description" content="나 자신에게 응원 한마디!" />
.mypic {
            width: 100%;
            height: 300px;

            background-image: linear-gradient(0deg,
                    rgba(0, 0, 0, 0.5),
                    rgba(0, 0, 0, 0.5)),
            background-position: center 30%;
            background-size: cover;

06. 내 프로젝트를 서버에 올리기

# 웹서비스 런칭에 필요한 개념 소개

   : 내가 만든 프로그램 배포 > 웹 서비스 런칭

1) 로컬 서버 -> 클라우드 서버 : 내 컴퓨터를 켜놓지 않아도 접근할 수 있는 웹 서비스로 이동

   (1) 웹 서비스를 런칭하기 위해 클라이언트의 요청에 항상 응답해줄 수 있는 서버에 프로젝트를 실행

   (2) 언제나 요청에 응답하려면,

         1) 컴퓨터가 항상 켜져있고 프로그램이 실행되어 있어야하고,

         2) 모두가 접근할 수 있는 공개 주소인 공개 IP 주소(Public IP Address)로 나의 웹 서비스에 접근할 수 있도록 해야함

    (3) 서버 = 내 컴퓨터 대신 켜놓을 컴퓨터(데이터 센터=AWS(Amazon Web Service) 클라우드 서비스

    (4) 외부 접속이 가능하게 설정 > 내 컴퓨터를 서버 사용할 수도 있음 

로컬 개발 환경

2) 업로드하기

07. AWS Elastic Beanstalk으로 배포하기

# AWS Elastic Beanstalk(AWS의 배포서비스)

https://ap-northeast-2.console.aws.amazon.com/elasticbeanstalk/home?region=ap-northeast-2#/welcome

1. AWS에서 제공하는 쉬운 배포서비스

2. 코드를 압축하여 업로드 > AWS의 다양한 서비스를 알아서 연결

3. 배포링크 통해 쉽게 공유 가능 > 코드 업데이트 기능까지 제공

 

# [메모장] 배포 명령어 모음

- 터미널 준비하기 -

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

 

1) 액세스 키 가져오기

AWS 콘솔 > 오른쪽 위 부분의 계정이름 > 보안 자격 증명 > 액세스 키 > 새 액세스 키 만들기 > 액세스 키 ID보안 액세스 키 복사(메모장 저장, sparta → aws.txt 파일)

 

2) 터미널 명령어로 준비 완료하기!

mkdir deploy  deploy 폴더 생성

cp app.py deploy/application.py  app.py 파일 > deploy 폴더에 application.py라는 이름으로 바꿔서 복제

cp -r templates deploy/templates  templates 폴더를 deploy 폴더 안에 통째로 복제

pip freeze > deploy/requirements.txt  pip 명령어로 설치한 라이브러리 목록 > deploy 폴더 > requirements.txt 파일 기록

cd deploy  deploy 폴더 안으로 들어감 (폴더 더블클릭과 같은 기능)

3) 파일 설정 변경

application.py  app.py에서 이름을 바꿔줘야함

templates폴더 / index.html

requirements.txt  설치한 패키지들의 이름이 담긴 txt파일

* 폴더 안에 venv가 있으면 안됨

application.py 설정 : app.py를 application.py로 바꿔줌

application을 읽을 수 있도록 코드를 변경

app.run() 내용 지우기

 

# [코드] - application.py 배포 코드

 

from flask import Flask, render_template, request, jsonify

application = app = Flask(__name__)

 

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.kjechbb.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

 

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

 

@app.route("/guestbook", methods=["POST"])
def guestbook_post():
    name_receive = request.form['name_give']
    comment_receive = request.form['comment_give']
    doc = {
        'name':name_receive,
        'comment':comment_receive
    }
    db.fan.insert_one(doc)
   
    return jsonify({'msg': '저장 완료!'})

 

@app.route("/guestbook", methods=["GET"])
def guestbook_get():
    all_comments = list(db.fan.find({},{'_id':False}))
    return jsonify({'result': all_comments})

 

if __name__ == '__main__':

    app.run()

 

# [코드] - 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" />

        integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous" />
        integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
        crossorigin="anonymous"></script>

    <title>초미니홈피 - 응원 댓글창</title>

    <meta property="og:title" content="항해99 응원 댓글창" />
    <meta property="og:description" content="나 자신에게 응원 한마디!" />

        rel="stylesheet" />
    <style>
        * {
            font-family: "Noto Serif KR", serif;
        }

        .mypic {
            width: 100%;
            height: 300px;

            background-image: linear-gradient(0deg,
                    rgba(0, 0, 0, 0.5),
                    rgba(0, 0, 0, 0.5)),
            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>button {
            margin-top: 15px;
        }

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

        .mycards>.card {
            margin-top: 10px;
            margin-bottom: 10px;
        }
    </style>
    <script>
        $(document).ready(function () {
            set_temp();
            show_comment();
        });
        function set_temp() {
            fetch("http://spartacodingclub.shop/sparta_api/weather/seoul").then((res) => res.json()).then((data) => {
                let temp = data['temp']
                $('#temp').text(temp)
            });
        }
        function save_comment() {
            let name = $('#name').val()
            let comment = $('#comment').val()

            let formData = new FormData();
            formData.append("name_give", name);
            formData.append("comment_give", comment);

            fetch('/guestbook', { method: "POST", body: formData, }).then((res) => res.json()).then((data) => {
                alert(data["msg"]);
                window.location.reload()
            });
        }
        function show_comment() {
            fetch('/guestbook').then((res) => res.json()).then((data) => {
                let rows = data['result']
                $('#comment-list').empty()
                rows.forEach((a)=>{
                    let name = a['name']
                    let comment = a['comment']

                    let temp_html = `<div class="card">
                                        <div class="card-body">
                                            <blockquote class="blockquote mb-0">
                                                <p>${comment}</p>
                                                <footer class="blockquote-footer">${name}</footer>
                                            </blockquote>
                                        </div>
                                    </div>`
                    $('#comment-list').append(temp_html)
                })
            })
        }
    </script>
</head>

<body>
    <div class="mypic">
        <h1>항해99 응원 댓글창</h1>
        <p>현재기온: <span id="temp">36</span></p>
    </div>
    <div class="mypost">
        <div class="form-floating mb-3">
            <input type="text" class="form-control" id="name" placeholder="url" />
            <label for="floatingInput">닉네임</label>
        </div>
        <div class="form-floating">
            <textarea class="form-control" placeholder="Leave a comment here" id="comment"
                style="height: 100px"></textarea>
            <label for="floatingTextarea2">응원댓글</label>
        </div>
        <button onclick="save_comment()" type="button" class="btn btn-dark">
            댓글 남기기
        </button>
    </div>
    <div class="mycards" id="comment-list">
        <div class="card">
            <div class="card-body">
                <blockquote class="blockquote mb-0">
                    <p>새로운 앨범 너무 멋져요!</p>
                    <footer class="blockquote-footer">호빵맨</footer>
                </blockquote>
            </div>
        </div>
        <div class="card">
            <div class="card-body">
                <blockquote class="blockquote mb-0">
                    <p>새로운 앨범 너무 멋져요!</p>
                    <footer class="blockquote-footer">호빵맨</footer>
                </blockquote>
            </div>
        </div>
        <div class="card">
            <div class="card-body">
                <blockquote class="blockquote mb-0">
                    <p>새로운 앨범 너무 멋져요!</p>
                    <footer class="blockquote-footer">호빵맨</footer>
                </blockquote>
            </div>
        </div>
    </div>
</body>

</html>

 

4) awsebcli 패키지 설치하기

터미널 > pip install awsebcli 입력 >  엔터

 

5) awsebcli로 AWS Elastic Beanstalk 배포하기

1 # 다운로드 완료되었다면, eb 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

 

2 # eb create 환경이름 입력 > 엔터 > 생성까지 몇분 걸림

 

3 # 배포 환경 접속하기

AWS에 접속 → AWS 콘솔 연결하기 → Elastic Beanstalk → 생성한 환경 이름 확인 → OK 표

 

4 # [변경시] deploy 폴더 > 변경할 코드를 적고  > 저장

터미널에서 eb deploy 환경이름  입력 > 엔터 > 적용 완료