티스토리 뷰
지난시간에는
- 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 클래스에 드라이버를 연결하는 코드를 밑에 처럼 작성해야 함. (드라이버명 변경)
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 |
- 20200423
- chapter7
- 20200417
- 20200319
- 20200425
- 20200406
- 20201204
- 20200504
- 20200622
- 20200502
- 백준
- 20200510
- 20200413
- likelion
- 20200420
- 20200403
- 20200429
- 생활코딩리눅스
- 20200330
- 20200503
- 20200317
- 20200415
- 20200804
- 20200428
- 20200424
- 20200421
- 20200512
- chapter8
- 20200427
- 20200624
- Total
- Today
- Yesterday