로그인 Mysql DB연동
어제 만들어 둔 로그인페이지와 새로 설치한 mysql에 테이블을 생성해 회원 정보를 연동해보도록 하겠다.
MYSQL을 켜고
먼저 Database를 생성하자
게시판을 만들거니까 이름은 BBS
CREATE DATABASE BBS;
유저 테이블을 생성한다
CREATE TABLE USER(
userID VARCHAR(20),
userPassword VARCHAR(20),
userName VARCHAR(20),
userGender VARCHAR(20),
userEmail VARCHAR(50)
PRIMARY KEY (userID)
);
테이블을 생성한 뒤 좌측 Java Resources 내부에 src파일 안에 Package를 새로 만든다.
Package이름은 user
user안에 java파일을 새로 만들고 이름은 User.java
MySQL에서 만든 테이블을 그대로 담을 수 있도록 클래스를 선언해준다.
변수명이 똑같이
package user;
public class User {
private String userID;
private String userPassword;
private String userName;
private String userGender;
private String userEmail;
public String getUserID() {
return userID;
}
public void setUserID(String userID) {
this.userID = userID;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserGender() {
return userGender;
}
public void setUserGender(String userGender) {
this.userGender = userGender;
}
public String getUserEmail() {
return userEmail;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}
}
그리고 mySQL의 user Table과 연동할 UserDAO.java파일을 user패키지 안에 새로 만든다.
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;
public UserDAO() {
try {
String dbURL = "jdbc:mysql://localhost:3306/BBS";
String dbID = "root";
String dbPassword = "root";
Class.forName("com.mysql.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).contentEquals(userPassword)) {
return 1;
}
else
return 0;
}
return -1;
} catch (Exception e) {
e.printStackTrace();
}
return -2;
}
}
MySQL의 Database와 연동에 있어 중요한 코드 3줄을 보고 가자
String dbURL = "jdbc:mysql://localhost:3306/BBS";
SQL연결에 필요한 URL이다. 지난시간에 설치한 TOMCAT을 이용해 서버에 BBS유저로 접근한다.
Class.forName("com.mysql.jdbc.Driver");
Jdbc를 이용해 DB와 jsp를 연동한다.
conn = DriverManager.getConnection(dbURL,dbID,dbPassword);
이 명령어를 통해 DB와 jsp를 연결한다.
로그인 함수를 만든다.
로그인은 ID를 가져와 DB내부의 password와 비교하여 참인지, 거짓인지, 아이디가 존재하는지, DB오류인지를 return한다.
1을 리턴해야 로그인이 되고, 0은 비밀번호가 틀렸습니다, -1은 아이디가 없습니다, -2는 DB 오류를 나타낸다.
이 해당 로직을 jsp로 구현한다. -- 어제 함 하지만 여기서 오류발생
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"); %>
<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>Insert title here</title>
</head>
<body>
<%
String userID = null;
if(session.getAttribute("userID")!=null);{
userID = (String) session.getAttribute("userID");
}
if(userID != null){
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('이미 로그인 되어 있습니다.')");
script.println("location.href='main.jsp'");
script.println("</script>");
}
UserDAO userDAO = new UserDAO();
int result = userDAO.login(user.getUserID(), user.getUserPassword());
if(result==1){
session.setAttribute("userID",user.getUserID());
PrintWriter script = response.getWriter();
script.println("<script>");
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>
다음과 같이 한글이 깨진다.
첫 번째 이유는 지난시간 만든 login.jsp와 loginAction.jsp의 상단에 charset과 Encoding부분이 UTF-8이 아닌, EUC-KR로 되어있기 때문이다.
바꿔준다.
<%@ 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"); %>
두번째 이유는 mysql에 table을 utf-8로 받도록 변경한다.
ALTER TABLE user convert to charset utf8;
이전에 넣은 테이블은 안타깝게도 적용이 안된다.
로그인은 정상적으로 처리되나, URL에 main.jsp가 있고, main.jsp를 아직 만들지 않아 페이지를 불러올 수 없다고 나오면..
성공.
추가) 로그아웃은 짧아서..
logout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>logout page</title>
</head>
<body>
<%
session.invalidate();
%>
<script>
location.href="main.jsp";
</script>
</body>
</html>