728x90
2020/07/23 - [개인 프로젝트/JIDO] - 로그인 기능 구현하기 - 에러
에러를 고치기 위해 예전에 사용하던 방식으로 바꿨습니다.
mysql-connector-java-bin.jar 파일을 저 경로로 이동시켜줬어요.
UserDAO.java
DAO란?
데이터베이스에 접근하는 기능을 따로 모아서 DAO(Data Access Object)라고 칭합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
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/JIDO?serverIimezone=Asia/Seoul&useSSL=false";
String dbid = "root";
String dbpwd = "password";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(dburl,dbid,dbpwd);
}catch(Exception e) {
e.printStackTrace();
}
}
public int login(String email,String password) {
String sql = "SELECT password,nickname FROM user WHERE email=?";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, email);
rs = pstmt.executeQuery();
if(rs.next()) {
if(rs.getString("password").equals(password)) {
return 1;
}
else {
return 0;
}
}
return -1;
}catch(Exception e) {
e.printStackTrace();
}
return -2;
}
}
|
cs |
LoginCheck.jsp
User 자바빈과 UserDAO를 이용해서 로그인 기능을 마무리 해볼게요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
<%@ 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="email"/>
<jsp:setProperty name="user" property="password"/>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
UserDAO userDAO = new UserDAO();
int result = userDAO.login(user.getEmail(), user.getPassword());
if(result == 1){
PrintWriter pout = response.getWriter();
session.setAttribute("email",user.getEmail());
pout.println("<script>");
pout.println("location.href='map.jsp'");
pout.println("</script>");
}
else if(result == 0 || result == -1){
PrintWriter pout = response.getWriter();
pout.println("<script>");
pout.println("alert('이메일이나 비밀번호를 확인해주세요')");
pout.println("history.back()");
pout.println("</script>");
}
else if(result == -2){
PrintWriter pout = response.getWriter();
pout.println("<script>");
pout.println("alert('데이터베이스 오류가 발생했습니다. 잠시 후에 다시 시도해주세요.')");
pout.println("history.back()");
pout.println("</script>");
}
%>
</body>
</html>
|
cs |
Servlet에서처럼 request.getParameter를 사용하지 않았습니다.
Form으로 넘어온 값을 바로 user 빈에다가 넣어줍니다.
<jsp:setProperty name="user" property="email"/>
<jsp:setProperty name="user" property="password"/>
나머지는 DAO에서 return한 값을 이용해 액션들을 지정해주고 있습니다.
DAO를 사용하지 않은 Servlet ver.
DB 체크용으로 만들어뒀던 Servlet입니다.
개인적으로는 이쪽이 소스 분량도 적어서 좋습니다.
그러나 이게 코드를 짤때 기능을 하나씩만 부여하는 게 좋다고 하더라구요.
클린코드에서 그렇게 봤는데 제가 이해한 내용이랑 부합하는 지는 모르겠네요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/LoginDB")
public class LoginDB extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
HttpSession session = request.getSession();
String email = request.getParameter("email");
String[] parse = email.split("@");
String nickname = parse[0];
String password = request.getParameter("password");
try {
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/JIDO",
"root",
"비밀번호");
String sql = "SELECT password FROM user WHERE email=?";
stmt = conn.prepareStatement(sql);
stmt.setString(1, email);
rs = stmt.executeQuery();
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
while(rs.next()) {
if(rs.getString(1).equals(password)) {
session.setAttribute("email",email);
response.sendRedirect("map.jsp");
}
else {
out.println("<script>alert('아이디와 비밀번호를 다시 확인해주세요'); history.back();</script>");
}
}
out.println("</body></html>");
} catch (Exception e) {
throw new ServletException(e);
} finally {
try {if (rs != null) rs.close();} catch(Exception e) {}
try {if (stmt != null) stmt.close();} catch(Exception e) {}
try {if (conn != null) conn.close();} catch(Exception e) {}
}
}
}
|
cs |
한 가지 문제점이 또 남아있습니다.
바로 DB의 nickname을 세션에 어떻게 저장할 지에 관한 부분입니다.
일단 저번처럼 이메일에서 파싱해서 사용하는 것은 억지스러워서 그냥 이메일을 세션에 저장하도록 했습니다.
1.nickname 사용하기(이메일도 같이)
2.이메일만 사용하기
3.ID 사용하기(이메일 x)
728x90
'TechTalk' 카테고리의 다른 글
회원가입 기능 구현하기 (0) | 2020.07.27 |
---|---|
[Linux] Terminal이 무엇일까? (0) | 2020.07.26 |
로그인 기능 구현하기 - 에러 (0) | 2020.07.23 |
회원 데이터베이스 생성 및 로그인 기능 구현하기 - 준비단계 (0) | 2020.07.22 |
[JSP/Servlet]세션을 이용한 로그인 기능 구현하기 (0) | 2020.07.20 |