JSP_basic. SQL DB와 연동한 로그인 페이지를 수정해보자 (pstmt, session을 이용한 DELETE, UPDATE)

dwanGim·2022년 4월 6일
0

JSP_basic

목록 보기
5/15

DELETE 쿼리문을 JSP로 작성하기

INSERT를 해보았으니 DELETE와 UPDATE도 어려운 일이 아니게 되었습니다.

DELETE 로직을 먼저 수행해보겠습니다.

먼저 userDeleteForm.jsp를 생성하고 작성합니다.

<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("UTF-8");
	String uId = (String)session.getAttribute("s_id");
	String uPw = (String)session.getAttribute("s_pw");
	
	
	

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<row>
	<div class = "col-sm-6">
		<p><strong><%=uId%>님 정말 회원탈퇴하시겠습니까? 비밀번호를 확인해주세요.</strong></p>
		<form action="userDelete.jsp" method="post">
			<input type="password" name="uPw" placeholder="비밀번호를 다시 입력해주세요." class="form-control form-control-lg">
			<input type="submit" value="확인" class="btn btn-primary mb-3">
			<a href="loginWelcome.jsp">뒤로가기</a>
	</form>
	</div>
	</row>
</body>
</html>

비밀번호를 입력받으면 해당 데이터를 userDelete.jsp로 post 방식으로 전송할 것 입니다.

사용자가 입력한 비밀번호는 name="uPw"로 전송됩니다.

userDelete.jsp는 session을 이용해 다른 사용자가 이 페이지에 접근하지 못하도록 차단하고, 사용자가 입력한 비밀번호와 session에 저장된 비밀번호를 비교할 것 입니다.

아래는 그 전문입니다.

<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<%
	request.setCharacterEncoding("UTF-8");
	String uId = (String)session.getAttribute("s_id");
	String sPw = (String)session.getAttribute("s_pw");
	String uPw = request.getParameter("uPw");
	if (uId != null) {
	response.sendRedirect("userLoginForm.jsp");
	}
	
	String dbType = "com.mysql.cj.jdbc.Driver";
	String connectUrl = "jdbc:mysql://localhost:3306/jdbcprac2?serverTimezone=UTC";
	String connectId = "root";
	String connectPw = "mysql";
	
	
	
	try {
		Class.forName(dbType);
	
		Connection con = DriverManager.getConnection(connectUrl, connectId, connectPw);

		String sql = "DELETE FROM userinfo where user_id = ?";
		PreparedStatement pstmt = con.prepareStatement(sql);		
		pstmt = con.prepareStatement(sql);
		
		
		
		if (sPw.equals(uPw)){
			pstmt.setString(1, uId);
			pstmt.executeUpdate();
			session.invalidate();
			response.sendRedirect("userLoginForm.jsp");
					
		} else {
			System.out.println("비밀번호가 일치하지 않습니다.");
			response.sendRedirect("userDeleteForm.jsp");
		}
	

	} catch(Exception e){
		e.printStackTrace();
	}
	
	



%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	

</body>
</html>

먼저 필요한 데이터들을 미리 선언해둡니다.

	request.setCharacterEncoding("UTF-8");
	String uId = (String)session.getAttribute("s_id");
	String sPw = (String)session.getAttribute("s_pw");
	String uPw = request.getParameter("uPw");

이후엔 세션을 발급받지 않은 사용자를 로그인 창으로 돌려보냅니다.

	if (uId != null) {
	response.sendRedirect("userLoginForm.jsp");
	}
	

이후 pstmt를 준비하고 try~catch 문 안에 필요한 쿼리문을 작성합니다.

	String dbType = "com.mysql.cj.jdbc.Driver";
	String connectUrl = "jdbc:mysql://localhost:3306/jdbcprac2?serverTimezone=UTC";
	String connectId = "root";
	String connectPw = "mysql";
	
	
	
	try {
		Class.forName(dbType);
	
		Connection con = DriverManager.getConnection(connectUrl, connectId, connectPw);

		String sql = "DELETE FROM userinfo where user_id = ?";
		PreparedStatement pstmt = con.prepareStatement(sql);		
		pstmt = con.prepareStatement(sql);
		
		
		
		if (sPw.equals(uPw)){
			pstmt.setString(1, uId);
			pstmt.executeUpdate();
			session.invalidate();
			response.sendRedirect("userLoginForm.jsp");
					
		} else {
			System.out.println("비밀번호가 일치하지 않습니다.");
			response.sendRedirect("userDeleteForm.jsp");
		}
	

	} catch(Exception e){
		e.printStackTrace();
	}

session을 통해 변수들을 비교하여 if ~ else문에 대입하였습니다.

만약 session의 패스워드와 입력받은 패스워드가 동일하면 유저는 삭제될 것 입니다.

UPDATE문을 수행하는 jsp파일도 만들어보겠습니다.
먼저 userUpdateForm.jsp를 작성합니다.

<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.ResultSet"%>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// 회원 수정페이지는
	// 비번, 이름, 이메일을 수정할 수 있는 페이지입니다.
	// 이름, 이메일은 이미 내가 가입했던 정보가 채워져야합니다.
	request.setCharacterEncoding("UTF-8");
	String uId = (String)session.getAttribute("s_id");
	
	if (uId == null) {
	response.sendRedirect("userLoginForm.jsp");
	}
	
	String dbType = "com.mysql.cj.jdbc.Driver";
	String connectUrl = "jdbc:mysql://localhost:3306/jdbcprac2?severTimezone=UTC";
	String connectId = "root";
	String connectPw = "mysql";
	
	ResultSet rs = null;
	
	try {
		Class.forName(dbType);
	
		Connection con = DriverManager.getConnection(connectUrl, connectId, connectPw);

		String sql = "SELECT * FROM userinfo WHERE user_id = ?";
		
		PreparedStatement pstmt = con.prepareStatement(sql);
	
		pstmt.setString(1, uId);
		rs = pstmt.executeQuery();
		
		if(rs.next()){
			rs.getString(1);
			rs.getString(2);
			rs.getString(3);
			rs.getString(4);
		} 
	} catch(Exception e){
		e.printStackTrace();
	}
	
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<row>
		<div class="col=sm=6">
			<% 			%>
			<p><strong><%=rs.getString(1)%> 회원님,  정보 수정을 하시겠습니까?</strong></p><br/>


		</div>
	</row>
	<row>
		<div class="col-sm-6">
		<form action="userUpdateCheck.jsp" method="post">
			<input type="hidden" name="userId" value = "<%=rs.getString(1) %>">
			비밀번호 : <input type="password" name="userPw" placeholder="수정할 비밀번호를 입력해주세요." class="form-control form-control-lg">
			이름 : <input type="text" name="userName" placeholder="수정할 이름을 입력해주세요." value = "<%= rs.getString(3) %>" class="form-control form-control-lg">
			이메일 : <input type="text" name="userMail" value ="<%=rs.getString(4) %>"placeholder="수정할 이메일을 입력해주세요." class="form-control form-control-lg">
			<input type="submit" value="수정하기" class="btn btn-primary mb-3">
			<a href="userLoginForm.jsp">뒤로가기</a>
		</form>
		</div>
	</row>

			

</body>
</html>

여기서도 동일하게

if (uId == null) {
	response.sendRedirect("userLoginForm.jsp");
	}

를 이용해 session 체크를 먼저했습니다.

이후엔 rs.getString으로 사용자의 정보를 모두 불러왔습니다.

중요한 body 태그의 form에서 사용자가 입력하는 정보들을 취합할 것 입니다.

<body>
	<row>
		<div class="col=sm=6">
			<% 			%>
			<p><strong><%=rs.getString(1)%> 회원님,  정보 수정을 하시겠습니까?</strong></p><br/>


		</div>
	</row>
	<row>
		<div class="col-sm-6">
		<form action="userUpdateCheck.jsp" method="post">
			<input type="hidden" name="userId" value = "<%=rs.getString(1) %>">
			비밀번호 : <input type="password" name="userPw" placeholder="수정할 비밀번호를 입력해주세요." class="form-control form-control-lg">
			이름 : <input type="text" name="userName" placeholder="수정할 이름을 입력해주세요." value = "<%= rs.getString(3) %>" class="form-control form-control-lg">
			이메일 : <input type="text" name="userMail" value ="<%=rs.getString(4) %>"placeholder="수정할 이메일을 입력해주세요." class="form-control form-control-lg">
			<input type="submit" value="수정하기" class="btn btn-primary mb-3">
			<a href="userLoginForm.jsp">뒤로가기</a>
		</form>
		</div>
	</row>

			

</body>

session을 통해 사용자의 id를 넘겨받을 수도 있지만

이번엔

<input type="hidden" name="userId" value = "<%=rs.getString(1) %>"

라고 작성한 대로 hidden 타입을 이용해서 id 변수를 post했습니다.

그럼 userUpdateForm.jsp의 목적지인 userUpdateCheck.jsp를 작성해보겠습니다.

수행할 로직은 update도 비슷합니다.

<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<%
	request.setCharacterEncoding("UTF-8");
	
	String uId = request.getParameter("userId");	

	if (uId == null) {
	response.sendRedirect("userLoginForm.jsp");
	}

	
	String updatePw = request.getParameter("userPw");
	String updateName = request.getParameter("userName");
	String updateMail = request.getParameter("userMail");
	
	
	String dbType = "com.mysql.cj.jdbc.Driver";
	String connectUrl = "jdbc:mysql://localhost:3306/jdbcprac2?severTimezone=UTC";
	String connectId = "root";
	String connectPw = "mysql";

	
	try {
		Class.forName(dbType);
	
		Connection con = DriverManager.getConnection(connectUrl, connectId, connectPw);

		String sql = "UPDATE userinfo SET user_pw = ?, user_name = ?, email = ? WHERE user_id = ?";
		
		PreparedStatement pstmt = con.prepareStatement(sql);
	
		
		pstmt.setString(1, updatePw); 
		pstmt.setString(2, updateName); 
		pstmt.setString(3, updateMail);
		pstmt.setString(4, uId);
		pstmt.executeUpdate();
	} catch(Exception e){
		e.printStackTrace();
	}
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
		<row>
		<div class="col-sm-6">
			<p><strong><%= uId %>님의 회원정보가 수정완료되었습니다.</strong></p>
			<a href="loginWelcome.jsp">홈페이지로</a>
		</div>
	</row>

</body>
</html>

먼저 setCharacterEncoding과

session 체크는 항상 따라옵니다.

	request.setCharacterEncoding("UTF-8");
	
	String uId = request.getParameter("userId");	

	if (uId == null) {
	response.sendRedirect("userLoginForm.jsp");
	}

update할 변수들도 받아둡니다.

	String updatePw = request.getParameter("userPw");
	String updateName = request.getParameter("userName");
	String updateMail = request.getParameter("userMail");
	
	

이후엔 try~catch문 안에 pstmt를 준비하고

		String sql = "UPDATE userinfo SET user_pw = ?, user_name = ?, email = ? WHERE user_id = ?";
		
		PreparedStatement pstmt = con.prepareStatement(sql);
	
		
		pstmt.setString(1, updatePw); 
		pstmt.setString(2, updateName); 
		pstmt.setString(3, updateMail);
		pstmt.setString(4, uId);
		pstmt.executeUpdate();

와 같이 선언해주면 됩니다.

일단은 여기까지 입니다..

profile
배울 게 참 많네요.

0개의 댓글