E-book (12) 회원관리(수정,삭제)

이율곡·2023년 2월 5일
0

Project

목록 보기
14/15
post-thumbnail

서두

관리 부분을 들어가면서 테이블을 계속 수정했다. 오래 고민하며 테이블을 만들었는데 문제가 하나 둘 나오더니 결국에는 크게 수정하느라 시간이 오래 걸렸다. 아직도 해야 될 것들이 많지만 그래도 다시 차근차근 해보려 한다. 그 중 첫 번째가 회원관리이다.


삭제

삭제는 선택한 회원을 전부 삭제하는 일괄삭제와 하나의 회원만을 삭제하는 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 메서드는 받은 값을 수정하는 메서드이다.


정리하기

이번에는 회원관리를 진행했다. 어렵지는 않았는데 테이블에 문제가 생겨 생각보다 오래걸렸다. 회원에만 벌써 시간을 오래 사용했는데 앞으로는 어떨지 걱정이 앞선다. 그래도 다 경험이라 생각하고 다음에는 이런 실수를 줄어야겠다.

profile
음악을 좋아하는 사람이 음악을 만들 듯, 개발을 좋아하게 될 사람이 쓰는 개발이야기

0개의 댓글