[작성일: 2023. 04. 12]
로그인 기능 구현하기
데이터베이스에 하나의 회원 정보를 담을 수 있는 유저 테이블을 구축 완료했기 때문에 이제 실제 로그인 기능을 구현하면 된다.
로그인 기능을 구현하기 위해서는 JSP에서 회원 데이터베이스 테이블에 접근할 수 있도록 DAO가 있어야 한다.
DAO란?
데이터베이스 접근 객체로써 실질적으로 데이터 베이스에서 회원정보를 불러오거나 데이터베이스의 회원정보를 넣고자 할 때 사용한다.
나는 mariadb로 유저 테이블을 구축했기 때문에 이클립스와 mariadb를 연동했다.
[소스코드_DAO]
package user;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class UserDAO {
private Connection conn;
private PreparedStatement pstmt;
private ResultSet rs; // 정보를 담을 객체
public UserDAO() {
try {
String dbURL = "jdbc:mariadb://localhost:3399/bbs";
// 내 컴퓨터에 설치된 mariadb 서버의 bbs 데이터베이스에 접속
String dbID = "root";
String dbPassword = "1234";
Class.forName("org.mariadb.jdbc.Driver"); // 매개체 라이브러리
conn = DriverManager.getConnection(dbURL, dbID, dbPassword);
} catch(Exception e) {e.printStackTrace();}
}
public int login(String userID, String userPassword) {
String SQL = "SELECT userPassword FROM USER WHERE userID = ?";
try {
pstmt = conn.prepareStatement(SQL);
pstmt.setString(1, userID);
rs = pstmt.executeQuery();
if(rs.next()) {
if(rs.getString(1).equals(userPassword))
return 1; // 로그인 성공을 의미함.
else
return 0; // 비밀번호가 불일치함을 의미함.
}
return -1; // 아이디가 없음을 의미함.
} catch(Exception e) {e.printStackTrace();}
return -2; // 데이터베이스 오류를 의미함.
}
}
[소스코드_loginAction]
위에서 작성한 DAO로 로그인을 시도한 후에는 로그인 결과를 알려주는 페이지가 필요하다.
해당 소스코드는 실질적으로 사용자의 로그인 시도를 처리하는 페이지가 된다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="user.UserDAO" %>
<%@ page import="java.io.PrintWriter" %> <!-- 자바스크립트 문장을 작성하기 위함. -->
<% request.setCharacterEncoding("UTF-8"); %>
<!-- 건너오는 모든 데이터를 UTF-8로 받기 위함. -->
<jsp:useBean id="user" class="user.User" scope="page" />
<jsp:setProperty name="user" property="userID" />
<!-- 로그인페이지에서 넘겨준 userId를 받아 한 명의 사용자 userId에 넣어줌. -->
<jsp:setProperty name="user" property="userPassword" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
<%
UserDAO userDAO = new UserDAO();
int result = userDAO.login(user.getUserID(), user.getUserPassword());
if(result == 1) {
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("location.href = 'main.jsp'"); // 로그인에 성공했을 때 main.jsp로 이동
script.println("</script>");
} else if(result == 0 ){
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('비밀번호가 일치하지 않습니다.')"); // 로그인에 실패했 때 경고창을 띄움.
script.println("history.back()");
// 이전 페이지로 사용자를 돌려보냄. (로그인 페이지)
script.println("</script>");
} else if(result == -1) {
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('존재하지 않는 아이디입니다.')");
script.println("history.back()");
script.println("</script>");
} else if(result == -2) {
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('데이터베이스 오류가 발생했습니다.')");
script.println("history.back()");
script.println("</script>");
}
%>
</body>
</html>
[실행화면_loginAction]
처음 시도는 데이터베이스 오류를 만났다.
이 경우에는 새로운 프로젝트에 빌드패스를 등록해주지 않아서 생긴 오류라고 한다.
근데 빌드패스를 등록해 주었는데도 같은 오류가 떴다.
구글링 해 본 결과 빌드패스뿐만 아니라 Deployment Assembly에서도 Driver를 추가해줘야 해당 오류가 생기지 않는다고 한다.
바로 추가했더니 데이터베이스 오류는 사라졌다.
지금은 main.jsp가 없어서 오류페이지가 나온다.
데이터베이스에 입력했던 ID와 PW를 입력하고 로그인하면 성공적으로 main.jsp 페이지로 넘어간다.
여러 가지 방법으로 실행해 보았는데 정상적으로 로그인페이지가 작동했다.
다만 궁금한 점은, 강의에서는 loginAction.jsp에서 실행을 해도 login.jsp에서 실행되며 바로 로그인 화면이 뜨던데 나는 그렇지 않았다.
loginAction에서 실행할 경우 바로 존재하지 않는 아이디라는 경고창이 먼저 뜬다.
이것도 해결할 방법이 있는지 계속 찾아봐야 할 거 같다.
🐣 입문 개발자가 작성한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.
🐣 출처: https://youtu.be/RYo3OGlRoJw