** ๐Ÿ“Œ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ๊ตฌํ˜„ **

๊ด€๋ฆฌ์ž๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ „์ฒด ๋ฆฌ์ŠคํŠธ, ์‚ญ์ œ, ๊ถŒํ•œ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ ๊ตฌํ˜„

ํšŒ์› ๋ฆฌ์ŠคํŠธ ๊ด€๋ฆฌ๋ถ€ํ„ฐ ์‚ญ์ œ/๋ณ€๊ฒฝ ์ฒ˜๋ฆฌ๊นŒ์ง€ ์™„์ „ ์ •๋ฆฌ


๐Ÿงฉ ๋ชฉ์ฐจ

  1. ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋ž€?
  2. ์ „์ฒด ๊ธฐ๋Šฅ ํ๋ฆ„๋„
  3. ๊ธฐ๋Šฅ๋ณ„ ์—ญํ•  ์ •๋ฆฌ
  4. ์‹ค์ „ ์˜ˆ์ œ ์ฝ”๋“œ
  5. ๊ด€๋ฆฌ์ž ๊ถŒํ•œ ์ฒดํฌ ๋ฐ ๊ธฐ๋Šฅ ์˜ˆ์‹œ
  6. ๊ธฐ์ˆ  ๋ฉด์ ‘ ๋Œ€๋น„ ํ•ต์‹ฌ ์š”์•ฝ
  7. ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ + Notion ์ž‘์„ฑ ํŒ

โœ… 1. ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋ž€?

ํ•ญ๋ชฉ ์„ค๋ช…
์ •์˜ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹Œ ๊ด€๋ฆฌ์ž(admin)๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ด€๋ฆฌ ํŽ˜์ด์ง€
๋ชฉ์  ํšŒ์› ์ •๋ณด, ๊ฒŒ์‹œ๊ธ€, ๊ถŒํ•œ ๋“ฑ์„ ํ™•์ธํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ
์กฐ๊ฑด ์„ธ์…˜์— ์ €์žฅ๋œ ๋กœ๊ทธ์ธ ์•„์ด๋””๊ฐ€ ๊ด€๋ฆฌ์ž(admin)์ผ ๋•Œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

โœ… 2. ์ „์ฒด ๊ธฐ๋Šฅ ํ๋ฆ„๋„

[1] admin.jsp ์ ‘์† ์š”์ฒญ
 โฌ‡
[2] ์„ธ์…˜ ๊ฒ€์‚ฌ โ†’ ๋กœ๊ทธ์ธ ID๊ฐ€ 'admin'์ธ์ง€ ํ™•์ธ
 โฌ‡
[3] ๊ด€๋ฆฌ์ž์ผ ๊ฒฝ์šฐ โ†’ DAO์—์„œ ์ „์ฒด ๋ชฉ๋ก ์กฐํšŒ
 โฌ‡
[4] list ์ถœ๋ ฅ + ์‚ญ์ œ or ๊ถŒํ•œ๋ณ€๊ฒฝ ๋ฒ„ํŠผ ํ™œ์„ฑํ™”
 โฌ‡
[5] ์‚ญ์ œ ํด๋ฆญ ์‹œ โ†’ /delete?id=3 ์‹คํ–‰
[6] ๊ถŒํ•œ๋ณ€๊ฒฝ ํด๋ฆญ ์‹œ โ†’ /roleChange?id=3 ์‹คํ–‰

โœ… 3. ๊ธฐ๋Šฅ๋ณ„ ์—ญํ•  ์ •๋ฆฌ

๊ธฐ๋Šฅ ์—ญํ• 
โœ… ๊ด€๋ฆฌ์ž ์ธ์ฆ ๋กœ๊ทธ์ธ ์„ธ์…˜์˜ ID๊ฐ€ โ€˜adminโ€™์ธ์ง€ ํ™•์ธ
๐Ÿ“‹ ํšŒ์› ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ ์ „์ฒด ์‚ฌ์šฉ์ž ๋ชฉ๋ก์„ ์ถœ๋ ฅ (DAO์—์„œ SELECT *)
โŒ ํšŒ์› ์‚ญ์ œ ์„ ํƒํ•œ ํšŒ์›์˜ ID๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ DELETE ์‹คํ–‰
๐Ÿ” ๊ถŒํ•œ ๋ณ€๊ฒฝ ์ผ๋ฐ˜ํšŒ์› โ†’ ๊ด€๋ฆฌ์ž or ๊ด€๋ฆฌ์ž โ†’ ์ผ๋ฐ˜ํšŒ์›์œผ๋กœ ๋ณ€๊ฒฝ

โœ… 4. ์‹ค์ „ ์˜ˆ์ œ ์ฝ”๋“œ ๐ŸŽฏ


๐Ÿ“„ [1] admin.jsp

<%
  String loginId = (String) session.getAttribute("loginId");
  if (!"admin".equals(loginId)) {
%>
  <script>
    alert("๊ด€๋ฆฌ์ž๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.");
    location.href = "login.jsp";
  </script>
<%
    return;
  }
%>

<%@ page import="java.util.*, yourpackage.MemberDTO" %>
<%
  List<MemberDTO> list = (List<MemberDTO>) request.getAttribute("list");
%>

<h2>ํšŒ์› ๊ด€๋ฆฌ ํŽ˜์ด์ง€</h2>
<table border="1">
  <tr>
    <th>์•„์ด๋””</th>
    <th>์ด๋ฆ„</th>
    <th>๊ถŒํ•œ</th>
    <th>๊ด€๋ฆฌ</th>
  </tr>
<% for(MemberDTO dto : list) { %>
  <tr>
    <td><%= dto.getUserid() %></td>
    <td><%= dto.getName() %></td>
    <td><%= dto.getRole() %></td>
    <td>
      <a href="delete?id=<%= dto.getId() %>">์‚ญ์ œ</a> |
      <a href="roleChange?id=<%= dto.getId() %>">๊ถŒํ•œ๋ณ€๊ฒฝ</a>
    </td>
  </tr>
<% } %>
</table>

๐Ÿ“„ [2] AdminServlet.java โ€“ ๊ด€๋ฆฌ์ž ๋ชฉ๋ก ์กฐํšŒ

@WebServlet("/admin")
public class AdminServlet extends HttpServlet {
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {

    String loginId = (String) req.getSession().getAttribute("loginId");
    if (!"admin".equals(loginId)) {
      resp.sendRedirect("login.jsp");
      return;
    }

    MemberDAO dao = new MemberDAO();
    List<MemberDTO> list = dao.selectAll();
    req.setAttribute("list", list);
    RequestDispatcher rd = req.getRequestDispatcher("admin.jsp");
    rd.forward(req, resp);
  }
}

๐Ÿ“„ [3] MemberDAO.java โ€“ ๊ถŒํ•œ๋ณ€๊ฒฝ / ์‚ญ์ œ ๋ฉ”์„œ๋“œ

// ์‚ญ์ œ ๋ฉ”์„œ๋“œ
public void delete(int id) {
  try {
    Connection conn = DB.getConnection();
    String sql = "DELETE FROM members WHERE id=?";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setInt(1, id);
    ps.executeUpdate();
    conn.close();
  } catch (Exception e) {
    e.printStackTrace();
  }
}

// ๊ถŒํ•œ ๋ณ€๊ฒฝ ๋ฉ”์„œ๋“œ (admin โ†” user)
public void toggleRole(int id) {
  try {
    Connection conn = DB.getConnection();
    String sql = "UPDATE members SET role = IF(role='admin', 'user', 'admin') WHERE id=?";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setInt(1, id);
    ps.executeUpdate();
    conn.close();
  } catch (Exception e) {
    e.printStackTrace();
  }
}

๐Ÿ“„ [4] RoleChangeServlet.java

@WebServlet("/roleChange")
public class RoleChangeServlet extends HttpServlet {
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    int id = Integer.parseInt(req.getParameter("id"));
    MemberDAO dao = new MemberDAO();
    dao.toggleRole(id);
    resp.sendRedirect("admin");
  }
}

๐Ÿ“„ [5] DeleteServlet.java

@WebServlet("/delete")
public class DeleteServlet extends HttpServlet {
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    int id = Integer.parseInt(req.getParameter("id"));
    MemberDAO dao = new MemberDAO();
    dao.delete(id);
    resp.sendRedirect("admin");
  }
}

โœ… 5. ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ ์˜ˆ์‹œ

๊ธฐ๋Šฅ URL ์˜ˆ์‹œ ์„ค๋ช…
ํšŒ์› ๋ชฉ๋ก ๋ณด๊ธฐ /admin ๋ชจ๋“  ํšŒ์› ์ถœ๋ ฅ
ํšŒ์› ์‚ญ์ œ /delete?id=3 3๋ฒˆ ํšŒ์› ์‚ญ์ œ
๊ถŒํ•œ ๋ณ€๊ฒฝ /roleChange?id=3 3๋ฒˆ ํšŒ์›์˜ ๊ถŒํ•œ ํ† ๊ธ€

โœ… 6. ๊ธฐ์ˆ  ๋ฉด์ ‘ ๋Œ€๋น„ ํ•ต์‹ฌ ์š”์•ฝ ๐Ÿ’ฌ

์งˆ๋ฌธ ์š”์  ์ •๋ฆฌ
๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์— ์ ‘๊ทผ ์กฐ๊ฑด์€? ์„ธ์…˜ ๊ฐ’์ด 'admin'์ธ์ง€ ๊ฒ€์‚ฌ
๊ถŒํ•œ ๋ณ€๊ฒฝ์€ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”? UPDATE ์ฟผ๋ฆฌ์—์„œ IF(role='admin', 'user', 'admin')
์‚ญ์ œ ์‹œ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด? ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ID ์ „๋‹ฌ โ†’ PreparedStatement ์‚ฌ์šฉ
์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์™€ ๊ด€๋ฆฌ์ž ๊ตฌ๋ถ„ ๋ฐฉ์‹์€? members ํ…Œ์ด๋ธ”์˜ role ์ปฌ๋Ÿผ ๊ฐ’์œผ๋กœ ๊ตฌ๋ถ„

โœ… 7. ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ ๐Ÿง