코딩 개발일지/웹개발 종합반(스파르타 코딩클럽)

<스파르타 코딩클럽 웹개발 종합반 5주차>

찐쥬 2023. 3. 12. 23:15

<웹개발 종합반5주차 개발일지>

 

 

4주차에 이어 실습을 해보는 5주차!

 

4주차에 했던 실습은

첫 번째, 화성에서 땅사기(이름, 주소, 평수 저장하기)

두 번째, 스파르타 피디아(영화 url, 코멘트, 별점 기록하기)

 

5주차에 해볼 실습은

세 번째, 버킷리스트 페이지(버킷리스트 기록하기)

네 번째, 팬명록 페이지(현재기온, 닉네임, 댓글 남기기 / 인터넷배포)

 

 

 

실습하기에 앞서 인터넷 웹 서비스를 배포할 때 쓸 AWS 서비스에 가입하기로 한다.

 

AWS는 아마존에서 운영하는 클라우드 서비스임

(가입할 때 승인이 필요한 경우가 있음 - 시간 소요되니 미리! 해외결재 가능 카드 필요)

 

https://portal.aws.amazon.com/billing/signup#/start

 

AWS Console - Signup

 

portal.aws.amazon.com

요런 해외사이트 가입하는거..증말 번거롭고 어렵다.,

가입하기 완료..,

 

 

 

세 번째 실습! 버킷리스트 웹페이지 만들기

 

새로 만들 폴더 열기

그리고 여러번 해온 준비 작업!

 

app.py 파일 만들고, 가상환경 연결하기

라이브러리 깔고(flask, pymongo, dnspython, certifi),

templates 폴더 생생 후 하위에 index.html 파일 만들기

 

코드스니펫 뼈대 복붙(app.py, index.html)

#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)
								alert(data["msg"]);
            })
      }

      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"]);
          });
      }

    </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>
      </li>
    </div>
  </body>
</html>

mongoDB 로그인, app.py 실행해주기

웹브라우저에 localhost:5000 검색해서 들어가보기

 

GET 연결 완료! 문구가 뜬 뒤에, 하기와 같이 페이지가 뜸

기록하기도 마찬가지로 클릭하면 POST 연결 완료! 문구가 뜸

 

 

 

데이터 넣기부터 시작!

POST

 

내 버킷리스트 기록한 것을 불러와야 하니, 서버에서 받을  값은 1가지!

(bucket_give, bucket_receive)

값을 받아온 뒤에, db에 저장해줘야하니

 

dbprac.py 파일에 가서 라이브러리 임포트 내역과

저장하는 코드를 가져와 복붙해준다

# 데이터 저장, app.py-수정후1

@app.route("/bucket", methods=["POST"])
def bucket_post():
    bucket_receive = request.form['bucket_give'] # bucket_give 보내고, bucket_recevie 받기
    doc = {  #db에 저장해주기 위해 딕셔너리 형태로 bucket doc로 감싸 만들기
        'bucket' : bucket_receive
    }
    db.bucket.insert_one(doc) # db 저장하는 코드, 콜렉션 이름은 bucket

    return jsonify({'msg': 'POST 연결 완료!'})

 

서버 작업했으면, 프론트엔드 쪽으로

브라우저에서 이 부분을 읽어와야 하기 때문에,

html 뼈대 중에서 저 부분이 어디인지 찾아봐야 한다.

id가 bucket인 것을 확인!

 

(데이터 저장해야하니, 하단 코드에서 작업해줘야함)

# 데이터저장 index.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"]);
          });

 

save_bucket() 함수 안에 하단의 html 뼈대를 읽어오는 코드를 추가하면됨

# 데이터 저장 index.html 수정후-1
      function save_bucket() {
        let bucket = $('#bucket').val() # 아래 html 뼈대부분의 id를 가져와 불러오는 코드 추가
        
        let formData = new FormData();
        formData.append("sample_give", "샘플데이터");

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

 

추가로, 아래 새로 만들어진 formdata 안에,

app.py에 수정한 bucket_give를 넣어주고,

값은 방금 html 뼈대에서 불러오는 데이터를 만들어준 bucket을 넣어주면 됨

# 데이터 저장 index.html 수정후-2
      function save_bucket() {
        let bucket = $('#bucket').val() #이 값을 아래에서 새로운 폼데이터에 넣어주는 것임

        let formData = new FormData();
        formData.append("bucket_give", bucket); #bucket_give로 변경, 값은 상단의 bucket변수

        fetch('/bucket', {method: "POST",body: formData,}).then((response) => response.json()).then((data) => {
            alert(data["msg"]); # msg의 값을 저장완료로 바꿔줘야함(->app.py 에서)
          });

이후 alert를 타고 기록하기를 눌렀을 때 문구가 떠야하는데,

'POST 연결 완료!'가 아닌 '저장 완료!' 문구가 뜨도록 app.py에서 변경함

# 데이터 저장 app.py 수정후-2
@app.route("/bucket", methods=["POST"])
def bucket_post():
    bucket_receive = request.form['bucket_give']
    doc = {
        'bucket' : bucket_receive
    }
    db.bucket.insert_one(doc)

    return jsonify({'msg': '저장 완료!'}) # msg 값을 저장 완료! 로 변경

제대로 저장 되는지 테스트

 

코드 저장, 실행, 웹페이지 새로고침해서 버킷리스트 작성하고 기록하기 클릭

저장 완료! 정상적으로 뜨는 것 확인 완료

 

추가로 몽고디비에 데이터 잘 저장되었는지 확인

제대로 저장되었음 확인 완료

 

추가로 자동으로 refresh 시키기 위해 index.html에 코드 추가

# 데이터 저장 index.html 수정후-3
      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(); # 자동 새로고침 코드 추가
          });

POST 완료

 

 

 

 

이제 데이터 불러오기 시작!

GET

 

우선, DB에 저장된 모든 데이터를 꺼내와줘야하기 때문에,

dbprac.py에서 모든 값 불러오는 코드 복붙

# 데이터 불러오기 app.py 수정후-1
@app.route("/bucket", methods=["GET"])
def bucket_get():
    all_buckets = list(db.bucket.find({},{'_id':False})) # db 여러개 찾는 코드 복붙
    return jsonify({'msg': 'GET 연결 완료!'})             # 콜렉션명 bucket으로 변경, 변수도 변경

 

받아온 데이터를 프론트엔드로 내려줘야하니,

get 연결 완료가 아니라 데이터를 받은 변수로 넣어줌

# 데이터 불러오기 app.py 수정후-2
@app.route("/bucket", methods=["GET"])
def bucket_get():
    all_buckets = list(db.bucket.find({},{'_id':False}))
    return jsonify({'result': all_buckets}) # result 라는 변수는 all_buckets를 값으로 받음

 

프론트엔드에서 보내준 데이터를 받아와서 새로운 변수로 지정해줌

# 데이터 불러오기 index.html 수정후-1
      function show_bucket() {
        fetch('/bucket').then(res => res.json()).then(data => {
                let rows = data['result'] # data의 result값(app.py의 all_buckets)
                console.log(rows)         # rows라는 변수로 받고, 콘솔에 찍어서 테스트
            })

새로고침 후, 검사-콘솔탭에 가보면 rows가 잘 들어간 것 확인함

 

리스트 형태로 있으니 rows 반복문으로 돌려서 값 빼주면됨

# 데이터 불러오기 index.html 수정후-2
	function show_bucket() {
        fetch('/bucket').then(res => res.json()).then(data => {
                let rows = data['result']
                rows.forEach((a)=>{           # for문으로 rows를 돌려 a변수로 받고
                    let bucket = a['bucket']  # a의 bucket(콘솔탭보면됨)값을 가져옴
                    console.log(bucket)       # 콘솔에 찍어서 다시 테스트
                })

새로고침 후, 검사-콘솔탭에 가보면 rows가 반복문 돌아서 하나하나 빠져나온것 확인함

 

이제 콘솔에만 찍어주는게 아니라 temp_html에 append해서 붙여주면 됨

# 데이터 불러오기 index.html 수정후-3
      function show_bucket() {
        fetch('/bucket').then(res => res.json()).then(data => {
                let rows = data['result'] 
                $('#bucket-list').empty() # 기존에 있던 자료 비우기
                rows.forEach((a)=>{
                    let bucket = a['bucket']
                    let temp_html = `<li>    # temp_html 만들기
                                        <h2>✅ ${bucket}</h2> # html 뼈대에 붙일 영역 복붙
                                    </li>`
                    $('#bucket-list').append(temp_html) # 붙일 영역 id값 가져와서 append 해주기
                })
            })

새로고침 하니, 내가 기록했던 버킷리스트 내역이 뜨는걸 확인

 

추가로 하나 더 등록해보기

바로바로 추가되는 것을 확인했고

몽고디비에도 잘 저장되는 것을 확인

 

GET 완료

 

버킷 리스트 완료!!!!!!!!!!!!

 

 

 

이어서 네 번째 실습! 팬명록 웹페이지 만들기

 

동일하게 새로 만들 폴더 열기

그리고 여러번 해온 준비 작업!

 

app.py 파일 만들고, 가상환경 연결하기

라이브러리 깔고(flask, pymongo, dnspython, certifi),

templates 폴더 생생 후 하위에 index.html 파일 만들기

 

코드스니펫 뼈대 복붙(app.py, index.html)

#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
      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=Noto+Serif+KR:wght@200;300;400;500;600;700;900&display=swap"
      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)
          ),
          url("https://cdn.topstarnews.net/news/photo/201807/456143_108614_510.jpg");
        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>

mongoDB 로그인, app.py 실행해주기

웹브라우저에 localhost:5000 검색해서 들어가보기

마찬가지로, 들어가면 GET 연결 완료!

댓글남기기 클릭하면 POST 연결 완료! 가 뜸

 

 

이번은 팬명록 위에 현재 기온을 나타내는 게 있으니 그것 먼저!

# 온도 index.html 수정전
 function set_temp() {
            fetch("http://spartacodingclub.shop/sparta_api/weather/seoul").then((res) => res.json()).then((data) => {
                console.log(data)
            });

fetch에 저장되어 있는 링크를 타고 들어가면

이렇게 뜨는걸 확인할 수 있고,

여기서 필요한 건 temp 값

# 기온 index.html 수정후-1
        function set_temp() {
            fetch("http://spartacodingclub.shop/sparta_api/weather/seoul").then((res) => res.json()).then((data) => {
                console.log(data['temp']) # ['temp'] 추가해서 콘솔탭 확인

콘솔탭에 temp가 잘 뜨는 것 확인 완료

 

콘솔탭이 아니라 '현재기온 :36도' 안에 넣어줘야함

# 온도 index.html 수정후-2
function set_temp() {
            fetch("http://spartacodingclub.shop/sparta_api/weather/seoul").then((res) => res.json()).then((data) => {
                let temp = data['temp'] # temp라는 변수에 값을 넣어주고
                $('#temp').text(temp) # html 뼈대에서 들어갈 자리 id명(temp)을 찾아서 .text로 넣어줌
            });

새로고침 해보면 반영된 것 확인 가능

 

 

 

데이터 넣기 시작!

POST

 

 

서버에서 필요한, 받아야하는 부분이 어디인지 확인해보기

 

닉네임과 응원댓글 2가지의 데이터를 프론트엔드에서 받아야 함.

# 데이터 저장 app.py 수정후-1
@app.route("/guestbook", methods=["POST"])
def guestbook_post():
    name_receive = request.form['name_give'] # 닉네임 받기 추가
    comment_receive = request.form['comment_give'] # 댓글 받기 추가

    return jsonify({'msg': 'POST 연결 완료!'})

 

DB에 저장하기

(dbprac.py  저장하기와 임포트 코드 복붙)

db에 붙여줄 doc 새로 만들고,

콜렉션 이름 새로 지정한다음 저장해서 실행하기

 

# 데이터 저장 app.py 수정후-2
@app.route("/guestbook", methods=["POST"])
def guestbook_post():
    name_receive = request.form['name_give']
    comment_receive = request.form['comment_give']
    doc = {                       # db에 저장할 딕셔너리 형태 doc 만들기
        'name' : name_receive,
        'comment' : comment_receive
    }
    db.fan.insert_one(doc) # 콜렉션 이름은 fan 으로 저장
    
    return jsonify({'msg': 'POST 연결 완료!'})

 

기록하기를 누르면' POST 연결 완료!'가 아니라 '저장 완료!'가 뜨도록 문구 변경

# 데이터 저장 app.py 수정후-3
@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': '저장 완료!'}) # 저장 완료!로 변경

서버쪽 코드 완료

 

 

프론트엔드 뼈대에서 사용자가 어디에 쓴 값을 불러와야 하는지 뼈대찾기

(닉네임, 응원댓글)

닉네임의 id는 name

응원댓글의 id는 comment

 

요 값들을 불러올 수 있게 함수 안에 넣어줌

# 데이터 저장 index.hteml 수정후-1
function save_comment() {
            let name = $('#name').val() # html 뼈대에서 사용자가 입력하는 영역 id 가져오는 코드
            let comment = $('#comment').val() # html 뼈대에서 사용자가 입력하는 영역 id 가져오는 코드
            
            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"]);
            });

 

작성자로부터 받아온 값을 백엔드에 보내줘야 하니, 

폼데이터 값 코드를 만들어줌

# 데이터 저장 index.html 수정후-2
function save_comment() {
            let name = $('#name').val()
            let comment = $('#comment').val()

            let formData = new FormData();
            formData.append("name_give", name); # name_give로 백엔드에 보내줌, 값은 위에 변수 name
            formData.append("comment_give", comment); # comment_give로 백엔드에 보내줌, 값은 위에 변수 comment

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

 

웹페이지 가서 테스트

닉네임, 응원댓글 작성해서 댓글남기기를 누르면 '저장완료!'가 잘뜨고

 

몽고디비 데이터베이스에도 잘 올라간 것 확인 완료

 

추가로, 웹페이지에 새로고침이 자동으로 되도록 코드 추가하기

# 데이터 저장 index.html 수정후-4
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() # 새로고침 코드 추가

 

응원댓글 하나 더 추가해서, 새로고침 되는지 체크 후 몽고디비 한 번 더 확인

 

POST 완료

 

 

 

이제 데이터 불러오기 시작!

GET

 

 

서버부터 만들기.

데이터베이스에 저장되어 있는 자료 전부 가져오기

 

dbprac.py에서 여러개 가져오기 코드 복붙

# 데이터 불러오기 app.py 수정후-1
@app.route("/guestbook", methods=["GET"])
def guestbook_get():
    all_fans = list(db.fan.find({},{'_id':False})) #여러개 가져오기 코드, 콜렉션이름 fan, 변수명 all_fans 변경
    return jsonify({'msg': 'GET 연결 완료!'})

 all_fans 값을 프론트엔드로 내려줘야함

# 데이터 불러오기 app.py 수정후-2
@app.route("/guestbook", methods=["GET"])
def guestbook_get():
    all_fans = list(db.fan.find({},{'_id':False}))
    return jsonify({'result': all_fans}) # 'result'로  all_fans의 값을 내려준다

 

프론트엔드에서 result가 잘 내려오는지 확인해야함

# 데이터 불러오기 index.html 수정후-1
function show_comment() {
            fetch('/guestbook').then((res) => res.json()).then((data) => {
                let rows = data['result'] # 변수지정, data['result'] 가져오기
                console.log(rows) # 콘솔탭으로 확인하기
            })

새로고침 후 콘솔탭가면 잘 들어온것 확인 완료

 

리스트형태? 반복문으로 돌려서 닉네임, 댓글 따로 받아주기

# 데이터 불러오기 index.html 수정후-2
function show_comment() {
            fetch('/guestbook').then((res) => res.json()).then((data) => {
                let rows = data['result']
                rows.forEach((a)=>{  # 반복문 돌리기
                    let name = a['name'] # 콘솔탭의 name을 name 이라는 변수로 넣어주기
                    let comment = a['comment']# 콘솔탭의 comment을 comment 이라는 변수로 넣어주기
                    console.log(name, comment) # 콘솔탭에 찍어서 테스트
                })
            })

콘솔에 잘 찍히는 것 확인

 

 

temp_html 만들어서 붙여주기

# 데이터 불러오기 index.html 수정후-3
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-body"> #temp-html 영역 복붙
                                        <blockquote class="blockquote mb-0">
                                            <p>${comment}</p> # 코멘트 들어가는 것 변수넣기
                                            <footer class="blockquote-footer">${name}</footer> # 네임 들어가는 것 변수넣기
                                        </blockquote>
                                    </div>`
                    $('#comment-list').append(temp_html) # 들어갈 영역의 id찾아 넣어서 append 해주기
                })
            })

저장후 새로고침하여 다시 확인,

 

새로운 닉네임 댓글 추가해보기

기존에 있던 내역 하단에 뜨는 것 확인 되고 새로 작성한 것도 제대로 들어감.

 

몽고디비 데이터베이스 안에도 제대로 들어간 것 확인 완료

GET 완료

 

여기까지 하면 팬명록 서버 만드는 것 완료!!!!!!!!!

 

 

 

이제 우리가 만든 팬명록 서비스를 클라우드 환경에 올리기 전에

(인터넷에 올려 모든 사람들이 볼 수 있게 하기 전에)

 

og 태그를 먼저 꾸며보도록 한다!

(링크 복붙했을 때 이미지, 제목 등이 이쁘게 나오게 하기 위해!)

 

 

index.html의 head부분에 <title> 밑에 og태그 코드스니펫 복붙

# og태그 index.html 수정후-1 <head> 부분에 추가하기
    <meta property="og:title" content="내 사이트의 제목" /> #추가
    <meta property="og:description" content="보고 있는 페이지의 내용 요약" /> #추가
    <meta property="og:image" content="이미지URL" /> #추가

 

그 다음, 자기가 좋아하는 가수의 공연이미지를 구글에 검색해보기

(난 뉴진스 >,.<)

 

이미지를 찾은 후 오른쪽마우스 - 이미지 주소 복사 클릭

 

코드에 이미지url을 지우고 붙여넣기

# og태그 index.html 수정후-2
    <meta property="og:title" content="내 사이트의 제목" />
    <meta property="og:description" content="보고 있는 페이지의 내용 요약" />
    <meta property="og:image" content="https://magazine.cheil.com/wp-content/uploads/2022/09/%EC%BD%98%ED%85%90%EC%B8%A0B_960_600_7-1.jpg" />
                                       # url 새로 복사한 것 붙여넣기

 

추가로, 하단에 내려보면 백그라운드 이미지 url도 바꿔주기

#og태그 index.html 수정후-3
.mypic {
            width: 100%;
            height: 300px;

            background-image: linear-gradient(0deg,
                    rgba(0, 0, 0, 0.5),
                    rgba(0, 0, 0, 0.5)),
                url("https://cdn.topstarnews.net/news/photo/201807/456143_108614_510.jpg");
                      # 요 백그라운드 이미지 url 수정해주기(기본은 10센치 이미지였음)

 

사이트의 제목도 바꿔주기

#og태그 index.html 수정후-4
<body>
    <div class="mypic">
        <h1>십센치(10cm) 팬명록</h1> #십센치 -> 뉴진스 바꿔주기
        <p>현재기온: <span id="temp">36</span>도</p>
    </div>

 

og태그 추가로 붙였던 곳의 제목도 똑같이 바꿔주기

#og태그 index.html 수정후-5
<meta property="og:title" content="뉴진스 팬명록" /> #내 사이트의 제목 <-바꿔주기
    <meta property="og:description" content="아티스트에게 응원 한마디!" /> #보고 있는 페이지의 내용 요약 <-바꿔주기
    <meta property="og:image" content="https://magazine.cheil.com/wp-content/uploads/2022/09/%EC%BD%98%ED%85%90%EC%B8%A0B_960_600_7-1.jpg" />

 

사이트 들어가서 새로고침 해보면

이렇게 백그라운드 사진과 내용이 바뀐 것이 확인 가능하다

 

 

이제 배포하기!

 

내 프로젝트를 서버에 먼저 올려야 함

원래 개념은 내 컴퓨터가 계속 켜져 있어야,

내 프로젝트를 배포해줄 수가 있는데 내 컴퓨터를 계속 켜놓긴 어려운일;

 

그럼 내 컴퓨터 대신 계속 켜져있을 컴퓨터를 구매해야함(?)

그걸 서버라고 부름!

수많은 본체들.. 수많은 서버들!

그러나 요즘은 컴퓨터를 직접 사서 셋팅하는 일은 없음.

인터넷 환경에서 컴퓨터를 대여함

어떻게? 클라우드 환경 이용!

 

그 클라우드 환경이 5주차 시작할 때 처음 깔았떤 AWS!

그 중에서 AWS Elastic Beanstalk 기능을 제공하고 있음

(배포가 쉽고, 자동화가 되어있는 쉬운 방식)

 

저 엘라스틱 빈스톡 기능을 활용해서 인터넷에 배포해 볼 예정

 

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

 

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

 

ap-northeast-2.console.aws.amazon.com

 

방법이.. 번거롭기 때문에 미래의 내가 다시 한다면

5-13 강의를 보고 따라하기를..!!!!!!

 

오른쪽 상단 본인 아이디 - 보안 자격 증명 클릭 후 - 엑세스키 생성

 

생성된 엑세스키와 비밀엑세스키를 복사해서 따로 메모장에 붙여넣고

배포 명령어 모음도 코드스니펫에서 복사해서 메모장에 같이 넣어준다.

 

이후 다시 vscode를 열어 터미널에 clear 입력해서 깔끔하게 만들어 준 후,

배포 명령어 모음을 순차적으로 터미널에 입력해서 실행한다

 

이후 application.py에 들어가서 기존에 있는 코드를 지우고 붙여넣어준다

 

이후 awsebcli 라이브러리 하나 또 설치해주고..

....

엄청 많은 설치들이 끝나고...

(올릴 파일들을 준비해놓고,

컴퓨터를 하나 구매하고...)

.....

.....

(미래의 나 자신.. 엑세스키 메모장을 확인해라^^)

 

 

다 완성 후 aws에서 왼쪽에 어플리케이션을 누르면 요런 화면이 뜸

왼쪽에 환경을 누르면 요런 화면이 뜸

저 오른쪽에 url을 들어가보면(컨트롤 누르고 누르면 새창에서 열림)

 

내 홈페이지를 볼 수 있음!

\

og태그 확인

카톡창에 붙여넣으니 og태그도 내가 지정한대로 이쁘게 나오는 것을 확인할 수 있다.

 

이렇게 하면 배포까지 완료한 것!!!!!!!

 

 

추가로 하나 더,

수정할 때는 어떻게?

 

deploy 폴더 안에 있는 내용들이 실제로 배포가 되는 것

내 컴퓨터에서 돌려 본다음에(localhost:5000) 괜찮으면 배포하면 됨.

 

폴더를 열고, venv로 맞춰준 다음(새터미널)

내 app.py에 들어가서 오른쪽마우스 - 파이썬 파일 실행해서

localhost:5000 에 들어가서 확인해 본 뒤,

templates의 index.html에 들어가서 제목을 '내가 만든 아이유 팬명록'이라고 바꾼다면

해당 <h1>을 바꾸고 저장하고 localhost:5000 다시 확인해보기

 

그 이후 바뀐부분을 그대로 복사한다.

그 다음 deploy 폴더 안에 있는 templates의 index.html에 들어가서

바뀐부분을 똑같이 바꿔준다.

(아니면, 원래 내 코드 전체를 복사해서 디플로이 index.html에 붙여넣기 해도됨ㅋ)

 

그럼 이제 업로드를 해줘야함

일단 deploy 폴더로 이동을 한 다음에 업로드를 해야함

cd deploy 터미널에 붙여넣고 엔터

그 상태에서 업로드!

eb deploy myweb 터미널에 붙여넣고 엔터

조금 기다리면 완료됨(url 다시 들어가보면 바뀌어있음)!

 

 

** 과금이 걱정된다면? **

** eb create를 자주하면 안됨!!!!!!!!!!!!!

할 때마다 서버를 구매하는 개념임

 

aws의 앨라스틱 빈스톡에 들어가서 어플리케이션을 들어가보면,

어플리케이션이 한 개만 있어야함

환경에 가도 한 개만 있어야함

그래야 돈이 안나감!!! 아주 중요

아까 위에서 본 이것!!!!!!!!!

 

혹시나 여러개가 있다면

선택-작업-어플리케이션 삭제 클릭

deploy 똑같이 입력 후 삭제 클릭

 

1년이 지나면 과금이 되니 위와 같은 방법으로 삭제!!!!

(후후 캘린더에 추가함)

 

마지막 숙제는 내가 만든 홈페이지 url을 제출하면 끝!

 

 

 

총 정리~~~~~~~~~~~~~~~~~~~~~ 꺆

 

1주차 프론트엔드(html css)

2주차 javasript

3주차 python(크롤링, 데이터베이스)

4주차 5주차 flask(파이썬 프레임워크, 서버만들기, 배포)

 

 

 

꺅!!!!!!!!!!!!!!!!!!끝!!!!!!!!!!!!!!!!!!!!!!!!

아직 기간은 3주밖에 지나지 않았지만 5주차까지 끝났당

서로에게 박수쳐주자고해서 남자친구가 박수쳐줬음 >_<

 

웹개발 강의를 들으면서,

처음에는 이해가 안되는 부분도 많고 개념이 모자라서 뭐지?했던것도 많았지만..

3번이상? 반복하면 머리에 들어오는 건 확실한 것 같다!

 

그리고 여러번 해보니 꽤 재밌다고 생각!!!!

 

선생님 강의 속도가 처음 배우는 사랑미 옆에서 코드를 따라쳐보면..

10분짜리 강의가 30분 40분을 잡아먹어서.. 빠른속도에 살짝.. 짜증이났는데..(ㅋ_ㅋ)

나중엔 선생님이 말하기 전에 후루룩 치는 내 모습에 뿌듯!

(틀릴때도 많았지만ㅎ)

 

내가 배운 건 정말 작은 부분....이겠지만

내 생각보다 웹개발을 배우는게 더 재미있었고(파이썬 데이터 분석보다ㅋ)

여태 배운 코드스니펫을 잘 활용하면

내가 만들고 싶은 홈페이지도 만들 수 있을 것 같다!

 

두 가지 강의를 같이 들어서 살짝 머리가 섞이고

이거 하고 저거 하고 좀 정신없이 따라다니기 바빴는데..

끝까지 완강한 내 자신 칭차내!

(아직 데이터 분석 2주차가 남았다...)

 

앞으로 나날이 발전하는 찐쥬가 되기를!

뿌듯하당 >_<!