πŸ“š TIL 4일차

temprmnΒ·2023λ…„ 5μ›” 18일
0
post-thumbnail

였늘 μ£Όμš” 사항 (5/18, λͺ©μš”일)

  1. 볡슡 - AWS, GET과 POST
  2. λ°œν‘œ μ€€λΉ„

μ˜€μ „ 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.py

POST = 정보λ₯Ό μ €μž₯(생성)ν•˜κ±°λ‚˜ κ°±μ‹ ν•  λ•Œ μ‚¬μš©ν•˜λŠ” λͺ…령어이닀. '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': 'μ €μž₯ μ™„λ£Œ!'λΌλŠ” 메세지λ₯Ό νŽ˜μ΄μ§€μ— λ„μš°λŠ” 일을 ν•œλ‹€.

좜처: 🌐 Fetch API 으둜 AJAX μš”μ²­ν•˜κΈ°

GET μš”μ²­ μ‚¬μš©ν•˜κΈ°

πŸ“ app.py

GET = 정보λ₯Ό κ°€μ Έμ˜¬ λ•Œ μ‚¬μš©ν•˜λŠ” λͺ…령어이닀. 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을 λΆ™μ—¬μ£ΌλŠ” 일을 ν•œλ‹€.

μž‘λ‹΄

μ–΄μ œ ν”„λ‘œμ νŠΈ μž‘μ—… λΆ„λŸ‰μ˜ λŒ€λΆ€λΆ„μ„ λλ‚΄μ„œ κ·ΈλŸ°μ§€ μ˜€λŠ˜μ€ μ œλ²• λ„λ„ν–ˆλ‹€. νŒ€μ›λΆ„λ“€ 쀑 ν•œ 뢄이 ν•˜μ°¨ν•˜μ…”μ„œ 정렬을 살짝 손 λŒ„ 것 λ§κ³ λŠ”? 더 ν• λ§Œν•œ 건 보이지 μ•Šμ•˜κ³ , 자슡과 λ¦¬ν”„λ ˆμ‹œμ— μ‹œκ°„μ„ 더 ν• μ• ν•  수 μžˆλŠ” λ‚ μ΄μ—ˆλ‹€. κ°‘μžκΈ° λΉ„κ°€ μ˜€λŠ” λ°”λžŒμ— 애써 말렀놓은 λΉ¨λž˜κ°€ λ‹€ μ –μ–΄μ„œ 정신이 μ—†μ—ˆμ§€λ§Œ...................... 🌧️🌧️🌧️

μ—¬νƒœ λ‹€λ₯Έ νŒ€λ“€ 결과물이 κΆκΈˆν–ˆλŠ”λ°, λ§ˆλ•…νžˆ λ³Ό 수 μžˆλŠ” 방법이 μ—†μ–΄μ„œ 아쉬웠닀. ν•˜μ§€λ§Œ 내일은 λŒ€λ§μ˜ λ°œν‘œμΌμ΄κΈ° λ•Œλ¬Έμ—... λ“œλ””μ–΄ λ³Ό 수 μžˆλŠ” κΈ°νšŒκ°€ μƒκ²Όκ΅¬λ‚˜! μ‹Άμ–΄μ„œ 내일이 였기λ₯Ό κ½€ κΈ°λŒ€ν•˜κ³  μžˆλ‹€. (κΈˆμš”μΌμ΄κΈ°λ„ ν•˜κ³ !)

profile
`ISFJ` T 49% F 51% /

0개의 λŒ“κΈ€