Coding 공부/IntelliJ

[IntelliJ_Servlet_MariaDB] Todo List#4 로그인, 로그아웃 기능추가

CBJH 2024. 4. 30.
728x90
반응형

1. Todo List 추가된 부분

  • 로그인 세션
  • 회원가입
  • 로그인 확인(DB연결)
  • 로그아웃

 

2. 추가된 코드

 

2.1 회원 등록

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>mRegister</title>
    <h1>회원등록</h1>
</head>
<body>
    <form action="/mRegister" method="post">
        <input type="text" name="mid" placeholder="id">
        <input type="password" name="mpw" placeholder="password">
        <input type="text" name="mname" placeholder="이름">
        <button type="submit">회원 등록</button>
    </form>
    <a href="/todo/list">홈으로</a>
</body>
</html>

 

@WebServlet(name="mRegisterController", urlPatterns = "/mRegister")
public class mRegisterController extends HttpServlet {
    TodoService todoService = TodoService.INSTANCE;
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("/WEB-INF/mRegister.jsp").forward(req, resp);
    }
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        MemberDTO memberDTO = MemberDTO.builder()
                .mid(req.getParameter("mid"))
                .mpw(req.getParameter("mpw"))
                .mname(req.getParameter("mname"))
                .build();
        try{
            todoService.mRegister(memberDTO);
        }catch (Exception e){
            e.printStackTrace();
        }
        resp.sendRedirect("/login");
    }
}
public void mRegister(MemberDTO memberDTO) throws Exception{
    dao.register(memberDTO);
}
public void register(MemberDTO memberDTO) throws Exception{
    String sql = "insert into tbl_member values(?,?,?)";
    @Cleanup Connection conn = ConnectionUtil.INSTANCE.getConnection();
    @Cleanup PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setString(1, memberDTO.getMid());
    pstmt.setString(2, memberDTO.getMpw());
    pstmt.setString(3, memberDTO.getMname());
    pstmt.executeUpdate();
}
  • 회원 등록의 흐름 : 브라우저에서 form 형식으로 post받아 컨트롤러에서 memberDTO타입으로 변환 후 서비스로 보내고, DAO에서 "INSERT INTO~" SQL 명령문으로 회원을 등록한다.

 

2.2 로그인 확인

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Login</title>
    <style>
        .submit-button{
            display: block;
        }
    </style>
    <script>
        <% if (request.getAttribute("loginError") != null) { %>
            alert('<%= request.getAttribute("loginError") %>');
        <% } %>
    </script>
</head>
<body>
    <form action="/login" method="post">
        <input type="text" name="mid">
        <input type="text" name="mpw">
        <button type="submit" class="submit-button">LOGIN</button>
    </form>
    <form action="/mRegister" method="get">
        <button type="submit" class="submit-button">회원등록</button>
    </form>
</body>
</html>

 

  • 로그인 버튼과 회원 등록 버튼이 있다.
  • 회원 등록은 새로운 페이지를 열어야하기 때문에 get방식으로 호출한다.
@WebServlet(name="LoginController", urlPatterns = "/login")
public class LoginController extends HttpServlet {
    TodoService todoService = TodoService.INSTANCE;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("/WEB-INF/login.jsp").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String mid = req.getParameter("mid");
        String mpw = req.getParameter("mpw");

        try{
            if(!todoService.login(mid, mpw)){
                req.setAttribute("loginError", "Invalid username or password");
                req.getRequestDispatcher("/WEB-INF/login.jsp").forward(req, resp);
                return;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        String str = mid;

        HttpSession session = req.getSession();
        session.setAttribute("loginInfo", str);
        resp.sendRedirect("/todo/list");
    }
}
public boolean login(MemberDTO memberDTO) throws Exception{
    String sql = "select * from tbl_member where mid=? and mpw=?";
    @Cleanup Connection conn = ConnectionUtil.INSTANCE.getConnection();
    @Cleanup PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setString(1, memberDTO.getMid());
    pstmt.setString(2, memberDTO.getMpw());
    @Cleanup ResultSet rs = pstmt.executeQuery();
    if(rs.next()){
        return true;
    }else {
        return false;
    }
}

 

  • doGet에선 페이지를 dispatcher로 열어준다.
  • (doPost에서도 dispatcher로 .jsp파일에 접근하여 새 페이지를 열어 줄 수 있다.)
  • doPost에선 입력받은 값을 getParameter로 받아 서비스의 login(String mid, String mpw) 메서드를 호출한다.
  • DB에서 아이디와 비밀번호가 일치하면 true를 반환 받는다.
  • 일치하지 않으면 login()메서드가 false를 반환하여 request에 "loginError"를 설정하고 login페이지로 이동하도록 한다.
  • 페이지에선 자바스크립트와 EL문을 사용하여 loginError가 set되어 있으면 loginError에 저장되어있는 "Invalid username or password"을 화면에 alter한다.

 

 

3. 로그아웃

@WebServlet(name="logOutController", urlPatterns = "/logout")
public class LogOutController extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();

        if(session.getAttribute("loginInfo") != null){
            session.removeAttribute("loginInfo");
            resp.sendRedirect("/todo/list");
        }
    }
}
  • loginInfo 세션을 removeAttribute한다.
  • /todo/list로 이동한다.(로그인 세션이 없으므로 /login 으로 이동한다.)

 

4. 앞으로 보완할 부분

 

  • tbl_member 테이블에 mid 고유키를 tbl_todo 테이블의 foregin키로 받는다.
  • 로그인한 사람에 따라 다른 todo 테이블을 /todo/list 페이지에 보여준다.
  • memberVO를 만든다.
  • memberDTO를 memverVO로 mapping하여 DB에 적용한다.

댓글