서두
관리 부분을 들어가면서 테이블을 계속 수정했다. 오래 고민하며 테이블을 만들었는데 문제가 하나 둘 나오더니 결국에는 크게 수정하느라 시간이 오래 걸렸다. 아직도 해야 될 것들이 많지만 그래도 다시 차근차근 해보려 한다. 그 중 첫 번째가 회원관리이다.
삭제
삭제는 선택한 회원을 전부 삭제하는 일괄삭제와 하나의 회원만을 삭제하는 2가지 쿼리를 만들었다. 둘 다 회원번호를 받아 삭제를 받는데 일괄삭제는 배열로 받아 삭제를 한다.
일괄삭제
Controller
exports.allDeleteMember = (req, res, next) => {
let memberNumber = [req.body.allDelete];
Member.allDeleteMember(memberNumber, (err) => {
if (err) {
console.log("오류를 확인하세요 : " + err);
} else {
res.render("admin/adminIndex", {
pageTitle: "Welcome E-book Admin Page",
member: req.session.user,
admin: req.session.admin,
});
}
});
};
일괄삭제의 컨트롤러다. memberNumber는 값을 배열로 받아 모델로 값을 넘겨준다.
Model
static allDeleteMember(memberNumber, cb) {
if (memberNumber) {
var sql =
"DELETE FROM member WHERE member_number IN (" + memberNumber + ")";
console.log(memberNumber);
connection.query(sql, (err, row, fields) => {
if (err) {
console.log("쿼리 1 에러 : " + err);
} else {
if (!row) {
console.log("값을 확인해주세요");
} else {
console.log("회원일괄삭제 성공!!");
cb();
}
}
});
} else {
console.log("아이디를 입력해주세요.");
}
}
일괄삭제의 모델이다. sql쿼리에서 IN으로 memberNumber를 받았다. memberNumber는 배열로 들어와서 일괄적으로 삭제할 수 있게 했다.
삭제
Controller
exports.getMemberDelete = (req, res, next) => {
let memberNumber = req.params.member_number;
Member.deleteMember(memberNumber, (err) => {
if (err) {
console.log("에러를 확인해주세요 : " + err);
} else {
res.render("admin/adminIndex", {
pageTitle: "Welcome E-book Admin Page",
member: req.session.user,
admin: req.session.admin,
});
}
});
};
삭제 컨트롤러에서 memberNumber는 params로 값을 받는다. 그 이유는 get방식으로 값을 보내기 때문이다.
Model
static deleteMember(memberNumber, cb) {
if (memberNumber) {
var memberBookInfSql =
"DELETE FROM member_book_inf WHERE userid = (SELECT userid FROM member WHERE member_number = " +
memberNumber +
")";
var memberSql =
"DELETE FROM member WHERE member_number = " + memberNumber;
connection.beginTransaction((err) => {
if (err) {
console.log("트랜잭션 에러 : " + err);
} else {
connection.query(memberBookInfSql, (err, row, fields) => {
if (err) {
console.log("멤버정보 DELETE 쿼리 에러 : " + err);
connection.rollback();
} else {
connection.query(memberSql, (err, row, fields) => {
if (err) {
console.log("멤버 DELETE 쿼리 에러 : " + err);
connection.rollback();
} else {
console.log("회원삭제 성공!!");
connection.commit();
cb();
// connection.end();
}
});
}
});
}
});
} else {
console.log("회원번호를 확인해주세요");
}
}
삭제의 모델이다. member_book_inf 테이블은 userid를 외래키로 받고 있기 때문에 삭제를 할 때 서브쿼리를 사용해서 userid를 찾아 삭제한다. 그리고 트랜잭션을 사용해서 member와 member_book_inf 테이블의 정보를 삭제한다.(그러나 외래키 함께 삭제하는 ON DELETE CASCADE를 사용으로 바꿔서 코드도 수정해야 한다.)
View
<%- include('../../admin/includes/admin-head-nav.ejs')%>
<div class="container px-4 px-lg-5">
<div class="row gx-4 gx-lg-5 align-items-center my-5 ">
<form action="/memberManage" method="POST">
<label for="searchMember">회원검색</label>
<input type="text" name="userid" id="userid" placeholder="회원 아이디를 입력해주세요">
<button type="submit" class="btn btn-primary">검색</button>
</form>
<% if(results) {%>
<form action="/allDeleteMember" method="POST">
<table>
<tr>
<th>선택</th>
<th>회원번호</th>
<th>이름</th>
<th>아이디</th>
<th>등록일</th>
<th>관리자여부</th>
<th>수정</th>
<th>삭제</th>
</tr>
<% for (result in results) { %>
<tr>
<td><input type="checkbox" name="allDelete" id="allDelete" value="<%= results[result].member_number %>"></td>
<td><%= results[result].member_number %></td>
<td><%= results[result].username %></td>
<td><%= results[result].userid %></td>
<td><%= results[result].created_at %></td>
<td>
<% if(results[result].admin_check == 0) { %>
회원
<% } else { %>
관리자
<% } %>
</td>
<input type="hidden" name="member_number" id="member_number" value="<%= results[result].member_number %>">
<td><a href="/update/<%= results[result].member_number %>" class="btn btn-success">수정</a></td>
<td><a href="/delete/<%= results[result].member_number %>" class="btn btn-danger">삭제</a></td>
</tr>
<% } %>
</table>
<button type="submit" class="btn btn-danger">일괄삭제</button>
</form>
<% } %>
</div>
</div>
<%- include('../../admin/includes/admin-footer.ejs')%>
View 파일이다. 회원을 검색하고 나온 결과로 수정과 삭제, 일괄삭제를 진행한다.
수정
Controller
exports.getUpdateMember = (req, res, next) => {
let memberNumber = req.params.member_number;
Member.updateMember(memberNumber, (result) => {
if (result) {
res.render("admin/manage/updateMember", {
pageTitle: "Member Update Page",
member: req.session.user,
admin: req.session.admin,
result: result,
});
} else {
console.log("오류를 확인해주세요.");
}
});
};
exports.updateMemberAction = (req, res, next) => {
let userid = req.body.userid;
let userpassword = req.body.userpassword;
let username = req.body.username;
let phone = req.body.phone;
let email = req.body.email;
let memberNumber = req.body.member_number;
Member.updateMemberAction(userid, userpassword, username, phone, email, memberNumber, (err) => {
if(err){
console.log('오류를 확인해주세요 : ' + err);
} else {
res.render("admin/adminIndex", {
pageTitle: "Welcome E-book Admin Page",
member: req.session.user,
admin: req.session.admin,
});
}
});
};
첫 번째 컨트롤러는 수정페이지로 이동하는 컨트롤러이다. 이때 수정할 값을 받기 위해 모델로 memberNumber 값을 보내 해당 값의 member 객체를 가져온다. 두 번째 컨트롤러는 수정할 값을 받아 모델로 값을 보낸다.
Model
static updateMember(memberNumber, cb) {
var sql = "SELECT * FROM member WHERE member_number = " + memberNumber;
if (memberNumber) {
connection.query(sql, (err, row, fields) => {
if (err) {
console.log("회원 불러오는 것에 실패했습니다 : " + err);
} else {
console.log("회원 불러오기 성공!!");
cb(row[0]);
}
});
} else {
console.log("회원번호를 확인해주세요.");
}
}
static updateMemberAction(
userid,
userpassword,
username,
phone,
email,
memberNumber,
cb
) {
var memberSql =
"UPDATE member SET userid = ?, userpassword = ?, username = ?, email = ?, phone = ? WHERE member_number = ?";
var param = [userid, userpassword, username, email, phone, memberNumber];
if (userid === "" && userpassword === "" && username === "") {
console.log("다시 한 번 확인해주세요.");
} else {
connection.query(memberSql, param, (err, row, fields) => {
if (err) {
console.log("업데이트 오류 쿼리 : " + err);
} else {
console.log("업데이트 성공!");
cb();
}
});
}
}
첫 번째 updateMember 메서드는 수정할 member값을 가져온다. 두 번째 updateMemberAction 메서드는 받은 값을 수정하는 메서드이다.
정리하기
이번에는 회원관리를 진행했다. 어렵지는 않았는데 테이블에 문제가 생겨 생각보다 오래걸렸다. 회원에만 벌써 시간을 오래 사용했는데 앞으로는 어떨지 걱정이 앞선다. 그래도 다 경험이라 생각하고 다음에는 이런 실수를 줄어야겠다.