티스토리 뷰

지난시간에는

 - DB 설치 (mysql)

 - 회원정보를 담을 수 있는 user 테이블 구축

 - 자바 빈즈로 User 클래스 정의

Goal

 - DAO 객체 생성

 - DAO 객체 내의 DB 접속 코드 입력

 - DAO 객체 내의 로그인 기능 정의

 - loginAction.jsp 파일 작성

1. DAO

 - 데이터베이스 접근 객체의 약어로써 DB와 Java파일을 연결해주는 jdbc 드라이버를 실행시켜 DB에서 회원 정보를 불러오거나 DB에 회원 정보를 넣고자 할 때 사용 

 - JSP에서 회원 DB 테이블에 접근할 수 있도록 DAO 클래스를 정의함

 

Java resources -> src -> UserDAO 클래스 생성 

 

1) DAO 클래스내의 DB 접속 코드 

package user;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class UserDAO {
	
	private Connection conn; // Connection : 데이터베이스에 접근하게 해주는 하나의 객체 
	private PreparedStatement pstmt;
	private ResultSet rs; // ResultSet : 어떠한 정보를 담을 수 있는 객체 
	
	public UserDAO() { // 생성자를 통해 UserDAO의 인스턴스가 생성되었을 때 자동으로 DB 커넥션이 이루어지도록함
		try {
			String dbURL = "jdbc:mysql://localhost:3306/BBS"; // localhost:3306 : 우리 서버에 설치된 mysql을 의미, /BBS : mysql안의 BBS라는 데이터 베이스에 접속할 수 있도록 함.
			String dbID = "root"; // dbID = "root" : root 계정에 접근할 수 있도록 함
			String dbPassword = "password"; // 패스워드나 ID를 다르게 입력하면 정상적으로 DB에 접속할 수 없음
			Class.forName("com.mysql.cj.jdbc.Driver"); // Class.forName : mysql driver를 찾을 수 있도록 함 *Driver : mysql에 접속할 수 있도록 매개체 역할을 해주는 하나의 라이브러리 
			conn = DriverManager.getConnection(dbURL, dbID, dbPassword); //conn : getConnection(db URL, dbID, dbPassword)를 이용하여 DB에 접속하고 접속이 완료가 되면 conn 객체안에 접속된 정보가 담긴다
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 

2) login 기능 구현 

 - pstmt ~ : preparedstatement에 어떠한 정해진 SQL문장을 DB 삽입하는 형식으로 인스턴스를 가져온다

 - pstmt.setSting(1, userID) : SQL injection 같은 해킹 기법을 방어하기 위한 수단으로 preparedstatement를 이용한다 하나의 문장을 미리 준비해 놓고 문장에 물음표를 넣어서 나중에 물음표에 해당하는 내용으로 userID를 넣어준다. 즉 매개변수로 넘어온 userID를 물음표에 들어갈 수 있도록 하여 실제로 DB에 접속을 시도하고자하는 사용자의 ID를 입력 받아서, ID의 존재 유무를 파악하여 해당 비밀번호를 DB에서 가져오도록 함.

 - if (rs.next()) ID가 존재하면 결과로 나온 userPassword를 받아서 접속을 시도한 userPassword와 동일하다면 return1을 하여 로그인 성공이라는 결과를 반환하고 그렇지 않으면 return 0을 통해 비밀번호가 틀렸다는 결과를 반환함 ID가 존재하지 않으면 return -1을 반환하여 ID가 없다고 리턴한다

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() {
	 	// ...
	}
	// 여기서 부터 
	public int login(String userID, String userPassword) { // 어떤 계정에 대한 실제로 로그인을 시도하는 함수, 인자값으로 ID와 Password를 받아 login을 판단함.
		String SQL = "SELECT userPassword FROM USER WHERE userID = ?"; // 실제로 DB에 입력될 명령어를 SQL 문장으로 만듬.
		try {
			pstmt = conn.prepareStatement(SQL);
			pstmt.setString(1,  userID);
			rs = pstmt.executeQuery(); // 어떠한 결과를 받아오는 ResultSet 타입의 rs 변수에 쿼리문을 실행한 결과를 넣어줌 
			if (rs.next()) {
				if (rs.getString(1).contentEquals(userPassword)) {
					return 1; // 로그인 성공
				}
				else {
					return 0; // 비밀번호 불일치
				}
			}
			return -1; // 아이디가 없음
		} catch (Exception e) {
			e.printStackTrace();
		}
		return -2; // DB 오류 
	}

}

 

2. loginAction.jsp

 - DAO에 구현한 로그인 판별 함수를 사용하여 결과를 사용자에게 알려주는 페이지 

 

loginAction.jsp 파일 생성 -> login.jsp의 내용 복사 붙여넣기 후 <body>안의 내용과 부트스트랩을 연결하는 <head>안의 코드 삭제하기. 

 

1) loginAction.jsp 코드 

 - int result = userDAO.login(user.getUserID(), user.getUserPassword()); : 로그인을 시도함. login페이지에서 입력된 userID와 userPassword값이 loginActoin페이지로 넘어와서 login함수에 인자값으로 들어와 함수를 실행해줌. 해당 결과 값은 -1부터 1까지 각각의 결과값으로 result에 담김 넘어온 데이터를 body태그에서 처리함 

 - 각 result 결과에 따라 if문 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="user.UserDAO" %> <!-- login 함수를 사용하여 로그인 처리를 하기 위해 user패키지의 UserDAO를 불러온다 -->
<%@ page import="java.io.PrintWriter" %> <!-- 자바 스크립트 문장을 작성하기 위해 사용-->
<% request.setCharacterEncoding("UTF-8"); %> <!-- 건너오는 모든 데이터를 UTF-8으로 받을 수 있도록 함 -->
<jsp:useBean id="user" class="user.User" scope="page"/> <!-- 한명의 회원 정보를 담는 User클래스를 자바 빈즈로 사용하며 현재 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 Web Site</title>
</head> 
<body>
	<%  // 로그인 페이지에서 넘겨준 userID와 userPassword를 받아서 로그인 판별
		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 페이지로 사용자를 보냄 
			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 == -2){ 
			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>");
		}
		
	%>
</body>
</html>

 

4. mysql jdbc driver

 - mysql에 접속하기 위해 mysql과 jdbc를 연결하는 driver를 다운로드 

 

구글에 mysql jdbc driver 검색 -> JSP 프로젝트 폴더에 압출을 푼 후 -> 다운 받은 폴더 안의 라이브러리 파일을 복사 ex mysql-connector-java-8.0.19 -> 복사 후 이클립스 프로젝트 안의 WEB-INF -> lib 폴더 안에 복사하기 -> 프로젝트 폴더 우클릭 -> properties -> java build path -> Libraries -> Add JARs -> 복사한 jar 파일 추가 후 확인 

 

5. 서버 테스트 후 login 해보기

 - 서버를 실행 한 뒤 login창에 임의의 ID와 password를 입력하고 확인을 눌렀을 때 경고창이 뜨면 지금까지 작성한 코드가 정상적으로 작동하는 것임.

 - DB에 저장한 gildong, 123456으로 접속했을 때 정상적으로 접속이 되어 404에러를 띄우면 DB와의 연결도 잘 된 것임.

 

 

 

* git bash에서 gitignore 만들기 & 이클립스에 입력할 내용 

( https://gbsb.tistory.com/11 )

 

*복습해야 할 개념

 - <% % > <%@ > 

 - 자바 빈즈 

 

* 에러 모음

- 타임존 에러

타임존 에러가 발생할 경우 밑과 같이 '?serverTimezone=UTC&useSSL=false' 부분을 추가하면 됨.

( https://vvh-avv.tistory.com/79 )

String dbURL = "jdbc:mysql://localhost:3306/BBS?serverTimezone=UTC&useSSL=false";

- 드라이버 실행 에러

DAO 클래스에 드라이버를 연결하는 코드를 밑에 처럼 작성해야 함. (드라이버명 변경)

( https://yenaworldblog.wordpress.com/2018/01/24/java-mysql-%EC%97%B0%EB%8F%99%EC%8B%9C-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-%EC%97%90%EB%9F%AC-%EB%AA%A8%EC%9D%8C/

Class.forName("com.mysql.cj.jdbc.Driver"); // com.mysql.jdbc.Driver가 아님

 

'JSP > MVC1 게시판 만들기' 카테고리의 다른 글

회원 데이터베이스 구축하기  (0) 2020.04.14
로그인 페이지 디자인  (0) 2020.04.13
개발 환경 설정, Hello World  (0) 2020.04.13
댓글