output/JSP

게시판 만들기 4강 로그인 기능 구현

hs_developer 2022. 6. 26. 18:54

JSP 게시판에서 로그인 기능을 구현하려면 JSP에서 회원 데이터베이스에 접근할 수 있도록 하는 DAO(Data Access Object)를 만들어야 한다.

 

DAO는 데이터베이스 접근 객체의 약자다. 하나의 회원 정보를 불러오거나 입력할 때 사용한다.

 

 

UserDAO.java

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; // 결과 값 받아오기
	
	// 기본 생성자
	// userDAO가 생성되면 자동으로 생성되는 부분
	// 메서드마다 반복되는 코드를 이곳에 넣으면 코드가 간소화 된다.
	public UserDAO()
	{
		try
		{
			String dbURL= "jdbc:mysql://localhost:3306/BBS?serverTimezone=UTC";
			String dbID= "root";
			String dbPassword= "happy";
			Class.forName("com.mysql.jdbc.Driver"); // mysql에 접속하게 하는 라이브러리
			conn= DriverManager.getConnection(dbURL, dbID, dbPassword); // 접속된 정보 담긴다
		} 
		catch(Exception ex) 
		{
			ex.printStackTrace();
		}
	}
	
	// 로그인 영역
	public int login(String userID, String userPassword)
	{
	    String SQL= "SELECT userPassword FROM USER WHERE userID= ?";

	    try
	    {
	        pstmt= conn.prepareStatement(SQL); // sql쿼리문을 대기시킨다
	        pstmt.setString(1, userID); // 첫번째 '?'에 매개변수로 받아온 'userID'를 대입
	        rs= pstmt.executeQuery(); // 쿼리를 실행한 결과를 rs에 저장

	        if(rs.next())
	        {
	            if(rs.getString(1).equals(userPassword))
	            {
	                return 1; // 로그인 성공
	            }
	            else
	            {
	                return 0; // 비밀번호 틀림
	            }
	        }
	        return -1; // 아이디 없음

	    }catch(Exception ex) {
	        ex.printStackTrace();
	    }
	    return -2; // 오류
	}
}

 

 

접근 제어자를 'private'로 Connection, PreparedStatement, ResultSet을 변수로 선언한다.

Connection = 연결
PreparedStatement = 설정 및 실행
ResultSet = 결과 값

 

UserDAO() - 기본 생성자 메서드(클래스가 실행될 때 자동으로 생성)
dbURL 데이터베이스에 연결 시키는 주소
dbID 데이터베이스 계정 - 따로 설정 안했으면 기본은 'root'
dbPassword 데이터베이스 비밀번호 - 설치할 때 설정한 것
Class.forName() JDBC 연결 클래스를 'String' 타입으로 불러온다 
DriverManager.getConnection 드라이버 매니저에 미리 저장했던 연결 URL과 DB 계정 정보를 담아 연결 설정을 한다

 

위 연결 코드들을 기본 생성자에 넣어 각 기능을 담당하는 메서드마다 똑같은 코드를 입력할 필요 없이 간소화 한다.

 

 


 

로그인 구현 메서드

// 로그인 영역
public int login(String userID, String userPassword)
{
    String SQL= "SELECT userPassword FROM USER WHERE userID= ?";

    try
    {
        pstmt= conn.prepareStatement(SQL); // sql쿼리문을 대기시킨다
        pstmt.setString(1, userID); // 첫번째 '?'에 매개변수로 받아온 'userID'를 대입
        rs= pstmt.executeQuery(); // 쿼리를 실행한 결과를 rs에 저장

        if(rs.next())
        {
            if(rs.getString(1).equals(userPassword))
            {
                return 1; // 로그인 성공
            }
            else
            {
                return 0; // 비밀번호 틀림
            }
        }
        return -1; // 아이디 없음

    }catch(Exception ex) {
        ex.printStackTrace();
    }
    return -2; // 오류
}

 

로그인 기능을 담당하는 'login' 메서드를 선언하고, 매개변수로 실제 사용자가 입력할 아이디(userID)와 비밀번호(userPassword)를 매개변수로 설정한다. 

 

실제 사용자가 입력한 내용은 매개변수에 담아와서 로그인 메서드를 실행할 때 각 위치에 브라우저에 넘어온 아이디와 비밀번호를 적용시켜 결과를 도출하고 'int' 타입으로 반환한다.

 

login(String userID, String userPassword) - 로그인 메서드
String sql 실제로 DB에 입력할 쿼리문을 'sql' 변수에 미리 담아둔다.
conn.preparedStatement(sql) 미리 설정한 'sql'을 세팅한다.
pstmt.setString(1, userID) 쿼리문의 '1'번째 물음표에 'userID'를 대입 시킨다.
rs = pstmt.executeQuery() 세팅이 끝난 쿼리문을 실행시키고 나온 결과 값을 'rs'에
저장한다.
rs.getString(1) 쿼리문을 실행하고 나온 첫 번째 결과 값을 'String' 타입으로
얻어온다.

 

여기서 'rs.next()'를 실행했을 때 결과 값이 존재하면 해당 결과 값을 얻을 수 있다.

 

그 결과 값에 따라 로그인 처리를 상황에 맞게 구현할 수 있다.

 

로그인 메서드에 세팅해 놓은 쿼리문은 매개변수로 받아온 'userID'의 'userPassword'를 구하는 쿼리문이다. 다시 말하면 실제 사용자가 입력한 ID의 비밀번호를 구하는 쿼리문이다.

 

 

로그인 결과 값 처리
결과 값이 존재하고 그 결과 값이 매개변수로 넘어온
'userPassword'와 일치한다.
로그인 성공(정수 1을 리턴)
결과 값이 존재하지만 그 결과 값이 매개변수로 넘어온
'userPassword'와 일치하지 않는다.
비밀번호 틀림(정수 0을 리턴)
쿼리문을 실행했지만 결과 값이 나오지 않았다. 존재하지 않는 아이디(회원 정보에 없는 아이디, -1을 리턴)

 

 


 

loginAction.jsp

<%@ 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" /> /* 이 페이지에서 넘어온 아이디가 담긴다 */
<jsp:setProperty name="user" property="userPassword" />

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; 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("alert('로그인 성공')");
			script.println("location.href='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>
페이지 설정 영역
<% request.setCharacterEncoding("UTF-8"); %> 넘어온 데이터 한글 깨짐 방지
<%@ page import="user.UserDAO" %> 만든 클래스 사용
<%@ page import="java.io.PrintWriter" %> 자바 스크립트 사용하기 위함
<jsp:useBean id="user" class="user.User" scope="page" /> User 클래스를 현 페이지에서 자바 빈즈로 사용
<jsp:setProperty name="user" property="userID" /> 로그인 페이지에서 받아온 사용자 ID를 'userID'에 저장
<jsp:setProperty name="user" property="userPassword" /> 로그인 페이지에서 받아온 사용자 ID를 'userPassword'에 저장
id 이름
class 패키지명을 포함한 클래스 경로
scope 사용 범위

 

UserDAO userDAO= new UserDAO();
int result= userDAO.login(user.getUserID, user.getUserPassword());

 

1. UserDAO 클래스 인스턴스 'userDAO'를 생성한다.

 

2. int 타입 변수 'result'에 'userDAO' 인스턴스 클래스의 'login' 메서드의 실행 결과를 저장한다.

이 때 'login' 메서의 매개변수는 실제 브라우저에서 사용자가 입력한 아이디와 비밀번호를 넣어 적용시킨다.

 

3. 로그인 메서드를 만들 때 결과에 따른 반환 값을 모두 다르게 설정한다. 'loginAction' 페이지에서도 그 반환 값에 맞게 로직을 각각 다르게 처리한다. 로직 처리는 자바스크립트의 도움을 받는다.

 

PrintWriter script = response.getWriter(); 자바스크립트 문장을 실행하게 한다.
location.href='main.jsp' 해당 페이지(main.jsp)로 이동시킨다.
alert('로그인 성공') 알림창을 띄우며 설정한 문구를 보여준다.
history.back() 이전 페이지로 돌아간다.

 


현재 MySQL 버전에 맞는 JDBC Driver 프로젝트에 추가하기

 

mysql-connector-java-8.0.29.jar
2.40MB

 

 

[프로젝트 우클릭] - [Build Path] - [Configure Build Path]로 JAR 파일 추가

 

 


 

실행 테스트

 

 

[프로젝트 우클릭] - [Run As] - [Run on Server]

 

 

 

DB에 저장한 아이디와 비밀번호 입력

 

 

 

 

'loginAction.jsp'에서 아이디와 비밀번호가 모두 맞으면 '로그인 성공'이라는 알림창이 뜨게 설정 해 다음 창이 뜸.

 

 

아이디와 비밀번호가 모두 맞으면 로그인 성공 창을 띄우고 'main.jsp' 페이지로 이동하라는 코드가 입력 되었기 때문에 페이지를 찾지 못해 뜨는 오류이다.

 

 

로그인 구현 끝