JAVA/JSP
[Python] SPA 형태의 CRUD
아잠만_
2024. 7. 10. 11:27
SPA(Single Page Application)
서버로부터 완전한 새로운 페이지를 불러오지 않고 현재의 페이지를 동적으로 다시 작성함
ajax(axios로 CRUD) 생성
daoemp.py
import pymysql
class DaoEmp :
def __init__(self):
self.conn = pymysql.connect(host='127.0.0.1',
port=3305,
user='root',
password='python',
db='python',
charset='utf8')
# DictCursor, Python에서 MySQL 쿼리 결과에 컬럼 자동으로 붙이기
# 칼럼이름 : value형식으로 출력됨
self.cur = self.conn.cursor(pymysql.cursors.DictCursor)
def selectList(self):
# sql문
sql = f"""
SELECT *
FROM emp
"""
# sql문을 cur에 입력
self.cur.execute(sql)
# 데이타 Fetch (가져오기)
rows = self.cur.fetchall()
return rows
def selectOne(self, eId):
# sql문
sql = f"""
SELECT *
FROM emp
WHERE e_id='{eId}'
"""
# sql문을 cur에 입력
self.cur.execute(sql)
# 데이타 Fetch (가져오기)
vo = self.cur.fetchone()
return vo
# list = self.cur.fetchall()
# return list[0]
def insert(self, eId, eName, gen, addr):
# sql문
sql = f"""
INSERT INTO emp
VALUES({eId}, {eName}, {gen}, {addr})
"""
# sql문을 cur에 입력
cnt = self.cur.execute(sql)
self.conn.commit()
return cnt
def update(self, eId, eName, gen, addr):
# sql문
sql = f"""
UPDATE emp
SET e_name='{eName}', gen='{gen}', addr='{addr}'
WHERE e_id='{eId}'
"""
# sql문을 cur에 입력
cnt = self.cur.execute(sql)
self.conn.commit()
return cnt
def delete(self, eId):
# sql문
sql = f"""
DELETE FROM emp
WHERE e_id ='{eId}'
"""
# sql문을 cur에 입력
cnt = self.cur.execute(sql)
self.conn.commit()
return cnt
def __del__(self):
self.cur.close()
self.conn.close()
if __name__ == '__main__':
de = DaoEmp()
cnt = de.insert(6, 6, 6, 6)
print(cnt)
list = de.selectOne(6)
print(list)
myflask.py
from flask import Flask, redirect
from flask.json import jsonify
from flask.globals import request
from day12.daoemp import DaoEmp
app = Flask(__name__)
@app.route('/')
def main():
return redirect('/static/emp.html')
@app.route('/emp_list.ajax', methods=['POST'])
def ajax_emp_list():
dao = DaoEmp()
data = dao.selectList()
return jsonify({"emp" : data})
@app.route('/emp_one.ajax', methods=['POST'])
def ajax_emp_one():
dao = DaoEmp()
e_id = request.get_json()['e_id']
data = dao.selectOne(e_id)
return jsonify({"emp" : data})
@app.route('/emp_add.ajax', methods=['POST'])
def ajax_emp_add():
data = request.get_json()
e_id = data['e_id']
e_name = data['e_name']
gen = data['gen']
addr = data['addr']
dao = DaoEmp()
cnt = dao.insert(e_id, e_name, gen, addr)
return jsonify({"cnt" : cnt})
@app.route('/emp_modify.ajax', methods=['POST'])
def ajax_emp_modify():
data = request.get_json()
e_id = data['e_id']
e_name = data['e_name']
gen = data['gen']
addr = data['addr']
dao = DaoEmp()
cnt = dao.update(e_id, e_name, gen, addr)
return jsonify({"cnt" : cnt})
@app.route('/emp_remove.ajax', methods=['POST'])
def ajax_emp_remove():
data = request.get_json()
e_id = data['e_id']
dao = DaoEmp()
cnt = dao.delete(e_id)
return jsonify({"cnt" : cnt})
if __name__ == '__main__':
# app.run(debug=True)
app.run(host="0.0.0.0", port=80, debug=True)
emp.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
input[type="text"]{
width: 100px;
}
</style>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
window.onload = function(){
fn_list();
}
function fn_list(){
// emp_list.ajax
axios.post('/emp_list.ajax').then(function(res){
let emp = res.data.emp;
let str = "";
emp.forEach(function(a){
str += `<tr>
<td><a href="javascript:fn_one(${a.e_id})">${a.e_id}</a></td>
<td>${a.e_name}</td>
<td>${a.gen}</td>
<td>${a.addr}</td>
</tr>`;
})
if(emp.length==0){
str = `<tr>
<td colspan="4">검색된 데이터가 없습니다</td>
</tr>`;
}
document.querySelector('#my_tbody').innerHTML = str;
});
}
function fn_one(e_id){
axios.post('/emp_one.ajax', {"e_id" : e_id}).then(function(res){
let emp = res.data.emp;
document.querySelector('#e_id').value = emp.e_id;
document.querySelector('#e_name').value = emp.e_name;
document.querySelector('#gen').value = emp.gen;
document.querySelector('#addr').value = emp.addr;
});
}
function add(){
let id = document.querySelector('#e_id').value;
let name = document.querySelector('#e_name').value;
let gen = document.querySelector('#gen').value;
let addr = document.querySelector('#addr').value;
let data = {
"e_id" : id,
"e_name" : name,
"gen" : gen,
"addr" : addr
};
axios.post('/emp_add.ajax', data).then(function(res){
var cnt = res.data.cnt
if(cnt==0){
alert('문제가 생겨 추가가 완료되지 않았습니다')
return;
}
fn_list();
reset();
});
}
function modify(){
let id = document.querySelector('#e_id').value;
let name = document.querySelector('#e_name').value;
let gen = document.querySelector('#gen').value;
let addr = document.querySelector('#addr').value;
let data = {
"e_id" : id,
"e_name" : name,
"gen" : gen,
"addr" : addr
};
axios.post('/emp_modify.ajax', data).then(function(res){
var cnt = res.data.cnt
if(cnt==0){
alert('문제가 생겨 수정이 완료되지 않았습니다')
return;
}
fn_list();
reset();
});
}
function remove(){
let id = document.querySelector('#e_id').value;
let data = {
"e_id" : id,
};
if(confirm("정말로 삭제하시겠습니까?")){
axios.post('/emp_remove.ajax', data).then(function(res){
var cnt = res.data.cnt
if(cnt==0){
alert('문제가 생겨 삭제가 완료되지 않았습니다');
return;
}
fn_list();
reset();
});
}
}
function reset(){
document.querySelector('#e_id').value = "";
document.querySelector('#e_name').value = "";
document.querySelector('#gen').value = "";
document.querySelector('#addr').value = "";
}
</script>
</head>
<body>
<a href="javascript:fn_list()">목록 가져오기</a>
<table border="1">
<thead>
<tr>
<th>사번</th>
<th>이름</th>
<th>성별</th>
<th>주소</th>
</tr>
</thead>
<tbody id="my_tbody">
<tr>
<td colspan="4">검색된 데이터가 없습니다</td>
</tr>
</tbody>
</table>
<br>
<table border="1">
<tbody>
<tr>
<th>사번</th>
<td><input type="text" id="e_id"></td>
</tr>
<tr>
<th>이름</th>
<td><input type="text" id="e_name"></td>
</tr>
<tr>
<th>성별</th>
<td><input type="text" id="gen"></td>
</tr>
<tr>
<th>주소</th>
<td><input type="text" id="addr"></td>
</tr>
<tr>
<td colspan="2">
<input type="button" value="추가" onclick="add()">
<input type="button" value="수정" onclick="modify()">
<input type="button" value="삭제" onclick="remove()">
</td>
</tr>
</tbody>
</table>
</body>
</html>
jquery ajax로 CRUD
(dao는 동일)
myflask.py
from flask import Flask, redirect
from flask.json import jsonify
from flask.globals import request
from day13.daoemp import DaoEmp
app = Flask(__name__)
@app.route('/')
def main():
return redirect('/static/emp.html')
@app.route('/emp_list.ajax', methods=['POST'])
def ajax_emp_list():
dao = DaoEmp()
data = dao.selectList()
return jsonify({"emp" : data})
@app.route('/emp_one.ajax', methods=['POST'])
def ajax_emp_one():
dao = DaoEmp()
e_id = request.form['e_id']
data = dao.selectOne(e_id)
return jsonify({"emp" : data})
@app.route('/emp_add.ajax', methods=['POST'])
def ajax_emp_add():
e_id = request.form['e_id']
e_name = request.form['e_name']
gen = request.form['gen']
addr = request.form['addr']
print(e_id)
dao = DaoEmp()
cnt = dao.insert(e_id, e_name, gen, addr)
return jsonify({"cnt" : cnt})
@app.route('/emp_modify.ajax', methods=['POST'])
def ajax_emp_modify():
e_id = request.form['e_id']
e_name = request.form['e_name']
gen = request.form['gen']
addr = request.form['addr']
dao = DaoEmp()
cnt = dao.update(e_id, e_name, gen, addr)
return jsonify({"cnt" : cnt})
@app.route('/emp_remove.ajax', methods=['POST'])
def ajax_emp_remove():
e_id = request.form['e_id']
dao = DaoEmp()
cnt = dao.delete(e_id)
return jsonify({"cnt" : cnt})
if __name__ == '__main__':
# app.run(debug=True)
app.run(host="0.0.0.0", port=80, debug=True)
emp.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
input[type="text"]{
width: 100px;
}
</style>
<script src="./jquery-3.7.1.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
window.onload = function(){
fn_list();
}
function fn_list(){
// emp_list.ajax
$.ajax({
url : "/emp_list.ajax",
type : "POST",
success : function(res){
// console.log(res);
let emp = res.emp;
let str = "";
$.each(emp, function(){
str += `<tr>
<td><a href="javascript:fn_one(${this.e_id})">${this.e_id}</a></td>
<td>${this.e_name}</td>
<td>${this.gen}</td>
<td>${this.addr}</td>
</tr>`;
})
if(emp.length==0){
str = `<tr>
<td colspan="4">검색된 데이터가 없습니다</td>
</tr>`;
}
$('#my_tbody').html(str);
}
})
}
function fn_one(e_id){
$.ajax({
url : "/emp_one.ajax",
type : "POST",
data : {"e_id" : e_id},
success : function(res){
let emp = res.emp;
$('#e_id').val(emp.e_id);
$('#e_name').val(emp.e_name);
$('#gen').val(emp.gen);
$('#addr').val(emp.addr);
}
});
}
function add(){
let id = $('#e_id').val();
let name = $('#e_name').val();
let gen = $('#gen').val();
let addr = $('#addr').val();
let data = {
"e_id" : id,
"e_name" : name,
"gen" : gen,
"addr" : addr
};
$.ajax({
url : "/emp_add.ajax",
type : "POST",
data : data,
success : function(res){
// console.log(cnt);
var cnt = res.cnt
if(cnt==0){
alert('문제가 생겨 추가가 완료되지 않았습니다')
return;
}
fn_list();
reset();
}
});
}
function modify(){
let id = $('#e_id').val();
let name = $('#e_name').val();
let gen = $('#gen').val();
let addr = $('#addr').val();
let data = {
"e_id" : id,
"e_name" : name,
"gen" : gen,
"addr" : addr
};
$.ajax({
url : "/emp_modify.ajax",
type : "POST",
data : data,
success : function(res){
var cnt = res.cnt
if(cnt==0){
alert('문제가 생겨 수정이 완료되지 않았습니다')
return;
}
fn_list();
reset();
}
});
}
function remove(){
let id = $('#e_id').val();
if(confirm("정말로 삭제하시겠습니까?")){
$.ajax({
url : "/emp_remove.ajax",
type : "POST",
data : {"e_id" : id},
success : function(res){
var cnt = res.cnt
if(cnt==0){
alert('문제가 생겨 삭제가 완료되지 않았습니다');
return;
}
fn_list();
reset();
}
});
}
}
function reset(){
$('#e_id').val("");
$('#e_name').val("");
$('#gen').val("");
$('#addr').val("");
}
</script>
</head>
<body>
<a href="javascript:fn_list()">목록 가져오기</a>
<table border="1">
<thead>
<tr>
<th>사번</th>
<th>이름</th>
<th>성별</th>
<th>주소</th>
</tr>
</thead>
<tbody id="my_tbody">
<tr>
<td colspan="4">검색된 데이터가 없습니다</td>
</tr>
</tbody>
</table>
<br>
<table border="1">
<tbody>
<tr>
<th>사번</th>
<td><input type="text" id="e_id"></td>
</tr>
<tr>
<th>이름</th>
<td><input type="text" id="e_name"></td>
</tr>
<tr>
<th>성별</th>
<td><input type="text" id="gen"></td>
</tr>
<tr>
<th>주소</th>
<td><input type="text" id="addr"></td>
</tr>
<tr>
<td colspan="2">
<input type="button" value="추가" onclick="add()">
<input type="button" value="수정" onclick="modify()">
<input type="button" value="삭제" onclick="remove()">
</td>
</tr>
</tbody>
</table>
</body>
</html>
MVC MVVM 비교
MVC | MVVM |
화면 깜빡 (화면이 넘어감) | 한 화면에서 이루어짐 |
화면 이동 용이 | |
크롤링이 용이 |