
μ€λ μ£Όμ μ¬ν (5/18, λͺ©μμΌ)
- λ³΅μ΅ - AWS, GETκ³Ό POST
 - λ°ν μ€λΉ
 
μ€μ  9μλΆν° λ°€ 9μκΉμ§ μ΄ 12μκ°μ μμμ 곡λΆλ§ νλ 건 νλ€μ§ μμλ°, λλκ³  보μμ¬λ¦¬(?)κ° λ°λν΄μ λλ€κ° λ¦κ² μλ μΌμ΄ μ’
μ’
 λ°μνλ€. λ¦μ μ·¨μΉ¨ β μμΉ¨ μΌμ° κΈ°μ β λ¦μ μ·¨μΉ¨ β (λ°λ³΅) ... μ νλ€λ³΄λ μμΉ¨μ μ μ  νΌκ³€ν΄μ§λ μ
μνμ΄... μ€λμ μΌμ° μμκ³  λ€μ§νλ©΄μ TIL 4μΌμ°¨ μμ± μμ.
λ΄μΌμ΄ λλ§μ λ°ν μΌ... λ°λ‘ κ³΅μ© μνΈλ₯Ό νμ λͺ©ν, ν΅μ¬ κΈ°λ₯, μλ‘κ² λ°°μ΄ κ²λ€, μκ°μ νμλ€κ³Ό ν¨κ» μμ±νλ€. μμ±ν μλ₯μ μμ λ¬Όλ€μ ν λλ‘ λ°ν λ΄λΉμ λΆμ΄ λ°ν μμμ 촬μνμ€ μμ .
μ€λ μμ΅μ μΉκ°λ° μ’
ν©λ° κ°μ 5μ£Όμ°¨μ μλ AWSμ λν΄ λ³΅μ΅ν΄λ³Ό μμ . (λ°λ‘ μ λ¦¬νμ§λ μμλ€) μΆκ°λ‘ GETκ³Ό POST λͺ
λ Ήμ λν κ²λ λ€μ νμ΅ νλλ°, 골머리 μνλ fetch()λ¬Έμ λλμ΄ μ΄ν΄νκ² λμλ€. νλ ¨ν¨ γ
γ
 
POST μμ² μ¬μ©νκΈ°app.pyμ index.html κ°μ GETκ³Ό POST μμ²μ΄ μ΄λ»κ² λμκ°λμ§... λ€μ ν λ² κ³΅λΆνλ€. μ΄μ  μμ±νλ pymongoμ flaskμ λν κΈλ μ°Έκ³ μ©μΌλ‘ 첨λΆ.
π pymongoλ‘ MongoDB μμνκΈ°
π¨βπ¬ flask μμνκΈ°
1β£ κ°μμλ²(venv)λ₯Ό μ΄κ³  flask, pymongo, dnspythonμ μ€μΉ
pip install flask pymongo dnspython
2β£ μ¬μ©ν  νλ μμν¬λ₯Ό importνκ³ , MongoDBμλ μ°κ²°
# νλ μμν¬ μν¬νΈ
from flask import Flask, render_template, request, jsonify
app = Flask(__name__)
# db μ°κ²°
from pymongo import MongoClient
client = MongoClient('λ΄ MongoDB URL')
db = client.dbsparta
POST μμ²app.pyPOST = μ λ³΄λ₯Ό μ μ₯(μμ±)νκ±°λ κ°±μ ν  λ μ¬μ©νλ λͺ
λ Ήμ΄μ΄λ€. 'bucket_give'λ₯Ό ν΅ν΄ λ€μ΄μ€λ μ λ³΄λ₯Ό bucket_recieve λ³μμ μ μ₯νλλ°, μ΄ 'bucket_give'λ μλ πindex.htmlμ save_bucket() λ©μλλ‘λΆν° λ°μμ¨λ€.
@app.route("/bucket", methods=["POST"])
def bucket_post():
    # 'bucket_give'λ₯Ό ν΅ν΄ λ€μ΄μ€λ μ λ³΄ μ μ₯
    bucket_receive = request.form['bucket_give']
    doc = {
        'bucket' : bucket_receive
    }
    # λ΄ λͺ½κ³ DB bucket μ½λ μ
μ λ°μ΄ν° μ½μ
    # = pymongo(insert_one)
    db.bucket.insert_one(doc)
	# 'μ μ₯ μλ£!' λΌλ λ©μΈμ§(msg)λ₯Ό λμ
    return jsonify({'msg': 'μ μ₯ μλ£!'})
index.html.val()μ μμ(form)μ κ°μ κ°μ Έμ€κ±°λ κ°μ μ€μ νλ λ©μλλΌκ³  νλ€. idκ° #bucketμΈ <input>μΌλ‘λΆν° κ°μ κ°μ Έμ€λ κ²μ΄λ€.
μΆμ²: jQuery / Method / .val() - μμ(form)μ κ°μ κ°μ Έμ€κ±°λ κ°μ μ€μ νλ λ©μλ
FormDataλ HTML λ¨μ΄ μλ μλ°μ€ν¬λ¦½νΈ λ¨μμ νΌ λ°μ΄ν°λ₯Ό λ€λ£¨λ κ°μ²΄μ΄λ€. append(key, value) λ©μλλ₯Ό ν΅ν΄ 'bucket_give'λΌλ key κ°κ³Ό bucketμ΄λΌλ value κ°μ μΆκ°νλ€.
μΆμ²: π FormData μ¬μ©λ² & μμ© μ΄μ 리 (+ fetch μ μ‘)
function save_bucket() {
	
  	// idκ° #bucketμΈ <input>μΌλ‘λΆν°
  	// κ°μ κ°μ Έμ bucket λ³μμ μ μ₯
	let bucket = $('#bucket').val();
  	// key = "bucket_give"
  	// value = bucket
	let formData = new FormData();
	formData.append("bucket_give", bucket);
  	// method: "POST" = μλ‘μ΄ POST μμ±
  	// body: formData = formData λ³μ ν λΉ
  
  	// .then()
  	// 1) μμ²μ΄ λλλ©΄ μλ΅μ JSON ννλ‘ νμ±ν΄μ€.
  	// 2) μμ²μ΄ λλλ©΄ `bucket_post()` λ©μλλ‘λΆν° λ°νλ
  	//    `'msg': 'μ μ₯ μλ£!'`λΌλ λ©μΈμ§λ₯Ό νμ΄μ§μ λμμ€.
	fetch('/bucket', { method: "POST", body: formData, })
      	.then((response) => response.json())
      	.then((data) => {
      
      		// νμ΄μ§μ "msg" λ©μΈμ§ λμ°κΈ°
			alert(data["msg"]);
      		// μλ‘κ³ μΉ¨
			window.location.reload();
		});
}
fetch('μλ²μ£Όμ') λ μΉ λΈλΌμ°μ μκ² 'μ΄ μλ²μ£Όμλ‘ μμ²ν΄μ€' λΌλ μλ―Έμ΄λ€. μ¬κΈ°μλ MongoDBμ 'bucket' μ½λ μ
μ μλ―Ένλκ² μλκ° μΆλ€.
μλ‘μ΄ ν¬μ€νΈλ₯Ό μμ±νκΈ° μν΄μ method μ΅μ
μ "POST"λ‘ μ§μ νκ³ , body μ΅μ
μλ formData λ³μλ₯Ό ν λΉνλ€.
.thenμ΄ λΆμΌλ©΄ 'μμ² λλκ³  μ΄ ν μΌμ ν΄μ€!' λΌλ μλ―Έμ΄λ€. response.json()μ μλ΅μ JSON ννλ‘ νμ±νλ μ λ³΄μ΄κΈ° λλ¬Έμ, 'μμ²μ΄ λλλ©΄ μλ΅μ JSON ννλ‘ νμ±ν΄μ€.' μ λλ‘ ν΄μν  μ μκ² λ€.
κ·Έλ° λ€μ data λ³μλ₯Ό μμλ‘ λ§λ€μ΄ λͺ
λ Ήμ μ²λ¦¬νλλ°, μμ πapp.pyμ bucket_post() λ©μλλ‘λΆν° λ°νλ 'msg': 'μ μ₯ μλ£!'λΌλ λ©μΈμ§λ₯Ό νμ΄μ§μ λμ°λ μΌμ νλ€.
GET μμ² μ¬μ©νκΈ°app.pyGET = μ λ³΄λ₯Ό κ°μ Έμ¬ λ μ¬μ©νλ λͺ
λ Ήμ΄μ΄λ€. db.[μ½λ μ
λͺ
].find()λ‘λΆν° κ°μ Έμ¨ μ λ³΄λ₯Ό all_bucketsλ³μμ μ μ μ₯νλ€. 그리고 λ°νλ 'result'λ μλ πindex.htmlμ show_bucket() λ©μλλ‘ μ λ¬λλ λͺ¨μμ(?)λ‘ λ³΄μΈλ€.
@app.route("/bucket", methods=["GET"])
def bucket_get():
    # μ λ³΄ κ°μ Έμ€κΈ°
    all_buckets = list(db.bucket.find({}, {'_id': False}))
	# all_bucketsλ₯Ό 'result'λ‘ λ°ν
    return jsonify({'result': all_buckets})
index.htmlμμ POSTμμ μΈκΈνλ― fetch('μλ²μ£Όμ')λ μΉ λΈλΌμ°μ μκ² 'μ΄ μλ²μ£Όμλ‘ μμ²ν΄μ€' λΌλ μλ―Έμ΄λ€. POSTμλ λ¬λ¦¬ methodλ body μ΅μ
μ λ°λ‘ 건λλ¦¬μ§ μμ κ±Έ νμΈν  μ μλ€.
fetch λ΄λΆμμλ πapp.pyλ‘λΆν° λ°νλ 'result': all_bucketsλ₯Ό rows λ³μμ μ μ₯νλ€. κ·Έλ° λ€μ, forEach()λ¬ΈμΌλ‘ rowsλ₯Ό νμνλ©΄μ bucket μ½λ μ
μ μλ λ°μ΄ν°λ₯Ό κ°μ Έμ μΆλ ₯νλ€.
function show_bucket() {
  	// '/bucket'μ GET μμ²
  	// μλ΅μ json ννλ‘ νμ±ν λ€μ
  	// dataλ₯Ό μ²λ¦¬νλ€
	fetch('/bucket')
		.then(res => res.json())
      	.then(data => {
      
      		// μμ `bucket_get`μΌλ‘ λΆν° μ λ¬λ°μ
      		// 'result'λ₯Ό row λ³μμ μ λ¬
			let rows = data['result'];
      		// idκ° '#bucket-list'μΈ νλͺ©μ λΉμ΄λ€λ λ»
      		// (= κ°±μ ν  λλ§λ€ μ΄κΈ°ν)
			$('#bucket-list').empty();
      		// forEach() λ¬Έμ λλ©΄μ
			rows.forEach((e) => {
              
              	// bucket μ½λ μ
μ μλ λ°μ΄ν°λ₯Ό κ°μ Έμ¨λ€
				let bucket = e['bucket']
                // html νκ·Έλ₯Ό μμ±
                // ${bucket} = λ°μμ¨ bucket μ λ³΄λ₯Ό μΆλ ₯νκΈ° μν λ¬Έλ²
				let temp_html
					= `
						<li>
							<h2>β
 ${bucket}</h2>
						</li>
					`
                // idκ° #bucket-listμΈ κ³³μ temp_html κ°μ λΆμΈλ€.
				$('#bucket-list').append(temp_html);
			
            }); // rows.forEach
        }) // fetch
}
$('#bucket-list').append(temp_html)λ idκ° #bucket-listμΈ κ³³μ μμ±λ temp_htmlμ λΆμ¬μ£Όλ μΌμ νλ€.
μ΄μ  νλ‘μ νΈ μμ λΆλμ λλΆλΆμ λλ΄μ κ·Έλ°μ§ μ€λμ μ λ² λλνλ€. νμλΆλ€ μ€ ν λΆμ΄ νμ°¨νμ μ μ λ ¬μ μ΄μ§ μ λ κ² λ§κ³ λ? λ ν λ§ν 건 보μ΄μ§ μμκ³ , μμ΅κ³Ό 리νλ μμ μκ°μ λ ν μ ν μ μλ λ μ΄μλ€. κ°μκΈ° λΉκ° μ€λ λ°λμ μ μ¨ λ§λ €λμ λΉ¨λκ° λ€ μ μ΄μ μ μ μ΄ μμμ§λ§...................... π§οΈπ§οΈπ§οΈ
μ¬ν λ€λ₯Έ νλ€ κ²°κ³Όλ¬Όμ΄ κΆκΈνλλ°, λ§λ ν λ³Ό μ μλ λ°©λ²μ΄ μμ΄μ μμ¬μ λ€. νμ§λ§ λ΄μΌμ λλ§μ λ°νμΌμ΄κΈ° λλ¬Έμ... λλμ΄ λ³Ό μ μλ κΈ°νκ° μ겼ꡬλ! μΆμ΄μ λ΄μΌμ΄ μ€κΈ°λ₯Ό κ½€ κΈ°λνκ³ μλ€. (κΈμμΌμ΄κΈ°λ νκ³ !)