개발일지/JSP

[JSP] 회원 정보 수정을 위한 파일 수정

연습용365 2021. 11. 29. 15:18
 

[JSP] 로그인 화면 분석 ④ (쿠키 적용, 로그아웃, nav 자동변경)

** log4j 관련 파일 ** WEB-INF > conf >  log4j 자동으로 log 파일이 만들어진다. **로그 관련 파일 ** web.xml (복붙) log4j가 어디있다 알려주면서 한글 깨지는 문제 처리 해주는 부분 **HttpE..

practice365.xyz

이어서 . . . 

 

 

 

지금까지는 로그인과 회원가입까지 성공을 했다.

이번엔 회원정보수정 페이지에서 수정 버튼을 눌렀을 때

제대로 값을 입력했는지 처리하는 걸 만들거다. 

 

 

 


<userUpdateForm.jsp>

- 제이쿼리문 작성

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.icia.common.util.StringUtil" %>
<%@ page import="com.icia.web.util.CookieUtil" %>
<%@ page import="com.icia.web.util.HttpUtil" %>
<%@ page import="com.icia.web.dao.UserDao" %>
<%@ page import="com.icia.web.model.User" %>
<%@ page import="org.apache.logging.log4j.LogManager" %>
<%@ page import="org.apache.logging.log4j.Logger" %>
<%
//로그
Logger logger = LogManager.getLogger("/user/userUpdateForm.jsp");
HttpUtil.requestLogString(request, logger);

User user = null;
String cookieUserId = CookieUtil.getValue(request, "USER_ID"); //쿠키 정보

//비어있지 않으면 로그인 돼 있으면
if(!StringUtil.isEmpty(cookieUserId))
{
	//쿠키 정보가 있다면
	logger.debug("cookieUserId : " + cookieUserId);
	
	UserDao userDao = new UserDao();
	user = userDao.userSelect(cookieUserId); //정보를 이렇게 넘김
	
	//DB에 없는 정상사용자가 아님
	if(user == null)
	{
		//정상 사용자가 아니라면 쿠키를 삭제하고 로그인 페이지로 이동
		CookieUtil.deleteCookie(request, response, "USER_ID");
		response.sendRedirect("/"); //index 페이지로 이동
	}
	else
	{
		if(!StringUtil.equals(user.getStatus(), "Y"))
		{
			//정지된 사용자인경우
			CookieUtil.deleteCookie(request, response, "USER_ID");
			user = null;
			
			response.sendRedirect("/");
		}
	}
}

if(user != null)
{
	//user가 null과 같지 않을 때
	
%>

<!DOCTYPE html>
<html>
<head>
<%@ include file="/include/head.jsp" %>
<script>
$(document).ready(function(){
	$("#btnUpdate").on("click", function(){
		//모든 공백체크 정규식
		var emptCheck = /\s/g;
		//영문 대소문자, 숫자로만 이루어진 4~12자리 정규식
		var idPwCheck = /^[a-zA-Z0-9]{4,12}$/;
		
		if($.trim($("#userPwd1").val()).length <= 0)
		{
			alert("비밀번호를 입력하세요.");
			$("#userPwd1").val("");
			$("#userPwd1").focus();
			return;
		}
		
		if(emptCheck.test($("#userPwd1").val()))
		{
			alert("비밀번호는 공백을 포함할 수 없습니다.");
			$("#userPwd1").focus();
			return;
		}
		
		if(!idPwCheck.test($("#userPwd1").val()))
		{
			alert("비밀번호는 영문 대소문자와 숫자로 4~12자리 입니다.");
			$('#userPwd1').focus();
			return;
		}
		
		if($("#userPwd1").val() != $("#userPwd2").val())
		{
			alert("비밀번호가 일치하지 않습니다.");
			$("#userPwd2").focus();
			return;
		}
		
		if($.trim($("#userName").val()).length <= 0)
		{
			alert("사용자 이름은 입력하세요.");
			$("#userName").val("");
			$("#userName").focus();
			return;
		}
		
		if(!fn_validateEmail($("#userEmail").val()))
		{
			alert("사용자 이메일 형식이 올바르지 않습니다.");
			$("#userEmail").focus();
			return;
		}
		
		//hidden
		$("#userPwd").val($("#userPwd1").val());
		//form
		document.updateForm.submit();
	});
});

function fn_validateEmail(value)
{
   var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
   
   return emailReg.test(value);
}
</script>
</head>
<body>
<%@ include file="/include/navigation.jsp" %>
<div class="container">
    <div class="row mt-5">
       <h1>회원정보수정</h1>
    </div>
    <div class="row mt-2">
        <div class="col-12">
            <form name="updateForm" id="updateForm" action="/user/userProc.jsp" method="post">
                <div class="form-group">
                    <label for="username">사용자 아이디</label>
                    <!-- 하드코딩에서 넣어준다 -->
                    <%=user.getUserId()%>
                    <!-- user객체의 get으로 갖고온다. -->
                </div>
                <div class="form-group">
                    <label for="username">비밀번호</label>
                    <input type="password" class="form-control" id="userPwd1" name="userPwd1" value="<%=user.getUserPwd()%>" placeholder="비밀번호" maxlength="12" />
                </div>
                <div class="form-group">
                    <label for="username">비밀번호 확인</label>
                    <input type="password" class="form-control" id="userPwd2" name="userPwd2" value="<%=user.getUserPwd()%>" placeholder="비밀번호 확인" maxlength="12" />
                </div>
                <div class="form-group">
                    <label for="username">사용자 이름</label>
                    <input type="text" class="form-control" id="userName" name="userName" value="<%=user.getUserName()%>" placeholder="사용자 이름" maxlength="15" />
                </div>
                <div class="form-group">
                    <label for="username">사용자 이메일</label>
                    <input type="text" class="form-control" id="userEmail" name="userEmail" value="<%=user.getUserEmail()%>" placeholder="사용자 이메일" maxlength="30" />
                </div>
                <input type="hidden" id="userId" name="userId" value="<%=user.getUserId()%>" />
                <input type="hidden" id="userPwd" name="userPwd" value="" />
                <button type="button" id="btnUpdate" class="btn btn-primary">수정</button>
            </form>
        </div>
    </div>
</div>
</body>
</html>
<%
}
%>

 



<UserDao.java>

- SQL 쿼리문 작성 및 복사

- userUpdate()메소드 작성하면서 붙여넣기

package com.icia.web.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.icia.web.db.DBManager;
import com.icia.web.model.User;

public class UserDao 
{
	private static Logger logger = LogManager.getLogger(UserDao.class);
	
	public UserDao()
	{
		
	}
	
	//사용자 id 체크
	public int userIdSelectCount(String userId)
	{
		int count = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		StringBuilder sql = new StringBuilder();
		//쿼리문 넣어야함
		
		sql.append("SELECT COUNT(USER_ID) AS CNT "); //반드시 띄어쓰기
		sql.append("  FROM TBL_USER ");
		sql.append(" WHERE USER_ID = ? ");
		
		try
		{
			conn = DBManager.getConnection();
			pstmt = conn.prepareStatement(sql.toString());
			
			pstmt.setString(1, userId); //0부터 아님
			
			rs = pstmt.executeQuery();
			
			if(rs.next()) //next() 첫번째 레코드값을 읽어 온다.
			{
				count = rs.getInt("CNT");
			}
		}
		catch(Exception e)
		{
			logger.error("[UserDao] userIdSelectCount Exception", e);
			//log4j를 이용한 출력
		}
		finally
		{
			DBManager.close(rs, pstmt, conn);
		}
		
		return count;
	}
	
	//사용자 조회
	public User userSelect(String userId)
	//객체 하나만 넘어가는 거임
	//모델 클릭
	{
		User user = null;
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append("SELECT ");
		sql.append("	USER_ID, ");
		sql.append(" NVL(USER_PWD, '') AS USER_PWD, ");
		sql.append(" NVL(USER_NAME, '') AS USER_NAME, ");
		sql.append(" NVL(USER_EMAIL, '') AS USER_EMAIL, ");
		sql.append(" NVL(STATUS, '') AS STATUS, ");
		sql.append(" NVL(TO_CHAR(REG_DATE, 'YYYY.MM.DD HH24:MI:SS'), '') AS REG_DATE ");
		sql.append(" FROM ");
		sql.append(" TBL_USER ");
		sql.append("	WHERE USER_ID = ? ");
		
		try
		{
			conn = DBManager.getConnection();
			pstmt = conn.prepareStatement(sql.toString());
			
			pstmt.setString(1, userId); //0부터 아님
			
			rs = pstmt.executeQuery();
			
			if(rs.next()) //next() 첫번째 레코드값을 읽어 온다.
			{
				user = new User();
				user.setUserId(rs.getString("USER_ID")); //세터메소드를 이용해서 하나씩 넣어줌
				user.setUserPwd(rs.getString("USER_PWD"));
				user.setUserName(rs.getString("USER_NAME"));
				user.setUserEmail(rs.getString("USER_EMAIL"));
				user.setStatus(rs.getString("STATUS"));
				user.setRegDate(rs.getString("REG_DATE"));
			}
		}
		catch(Exception e)
		{
			logger.error("[UserDao] userIdSelectCount Exception", e);
		}
		finally
		{
			DBManager.close(rs, pstmt, conn);
		}
		
		return user;
	}
	
	//회원정보 삽입
	public int userInsert(User user)
	//리턴타입 건수(count)라서 int로 처리
	//매개변수를 아이디, 비번, 이메일 등으로 받으려면 User 객체로 전달 받야한다.
	{
		int count = 0;
		//pstmt 날리고 나서 리턴타입을 카운트로 받을 거임
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append("INSERT INTO TBL_USER ");
		sql.append(" (USER_ID, USER_PWD, USER_NAME, USER_EMAIL, STATUS, REG_DATE ) "); 
		sql.append("VALUES (?, ?, ?, ?, ?, SYSDATE) ");
		//SQL Developer에서 그대로 복사해와서 사용
		//의무적으로 맨 끝에는 띄어쓰기를 해야한다.
		//SYSDATE 오라클에 있는 값을 넣어야하기 때문에 냅둠
		
		try 
		{
			int idx = 0;
			conn = DBManager.getConnection();
			pstmt = conn.prepareStatement(sql.toString());
			//pstmt.setString(4, "Y"); //이렇게 넣어 줄 수도 있음
			//rs 없으니까 끝~
			
			pstmt.setString(++idx, user.getUserId());
			//위에서 0을 설정함 1부터 시작을 해야 돼서 전치 증가 연산자
			pstmt.setString(++idx, user.getUserPwd());
			pstmt.setString(++idx, user.getUserName());
			pstmt.setString(++idx, user.getUserEmail());
			pstmt.setString(++idx, user.getStatus());
			//Y로 바로 넣을 수 있음
			//idx가 아니라 하드 코딩으로 숫자를 넣었다면 
			//위치가 변경될 때마다 내가 바꿔줘야하는 번거로움이 있다.
			
			count = pstmt.executeUpdate();
		}
		catch(Exception e)
		{
			logger.error("[UserDao] userInsert Exception", e);
		}
		finally
		{
			DBManager.close(pstmt, conn);
		}
		return count;
	}
	
	//사용자 정보 수정
	public int userUpdate(User user)
	{
		int count = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append("UPDATE TBL_USER "); 
		sql.append("   SET USER_PWD = ?, ");
		sql.append(" 	   USER_NAME = ?, ");
		sql.append(" 	   USER_EMAIL = ? ");
		sql.append(" WHERE USER_ID = ? ");
		//인수처리가 가능하니까 물음표
		
		try
		{
			int idx = 0; //추가될 수 있으니까
			conn = DBManager.getConnection();
			pstmt = conn.prepareStatement(sql.toString());
			
			pstmt.setString(++idx, user.getUserPwd());
			pstmt.setString(++idx, user.getUserName());
			pstmt.setString(++idx, user.getUserEmail());
			pstmt.setString(++idx, user.getUserId());
			
			count = pstmt.executeUpdate(); //Update
		}
		catch(Exception e)
		{
			logger.error("[UserDao] userUpdate SQLException", e);
		}
		finally
		{
			DBManager.close(pstmt, conn);
			//두 개만 넘김
		}
		return count;
	}
}



<userProc.jsp>

- 회원 정보 등록 / 회원 정보 수정 같이 사용한다.

 

	String cookieUserId = CookieUtil.getValue(request, "USER_ID");
	//CookieUtil, 용도 2 (회원 가입, 회원 정보 수정)

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.icia.common.util.StringUtil" %>
<%@ page import="com.icia.web.util.CookieUtil" %>
<%@ page import="com.icia.web.util.HttpUtil" %>
<%@ page import="com.icia.web.dao.UserDao" %>
<%@ page import="com.icia.web.model.User" %>
<%@ page import="org.apache.logging.log4j.LogManager" %>
<%@ page import="org.apache.logging.log4j.Logger" %>
<% 
	//로그
	Logger logger = LogManager.getLogger("/user/userIdCheckAjax.jsp");
	HttpUtil.requestLogString(request, logger);
	
	String redirectUrl = ""; 
	String msg = "";
	
	String userId = HttpUtil.get(request, "userId");
	String userPwd = HttpUtil.get(request, "userPwd");
	String userName = HttpUtil.get(request, "userName");
	String userEmail = HttpUtil.get(request, "userEmail");
	String cookieUserId = CookieUtil.getValue(request, "USER_ID");
	//CookieUtil, 용도 2 (회원 가입, 회원 정보 수정)
	
	UserDao userDao = new UserDao();
	
	//쿠키값 비어있을 때 처리
	if(StringUtil.isEmpty(cookieUserId)) 
	{
		//회원 가입
		if(!StringUtil.isEmpty(userId) && !StringUtil.isEmpty(userPwd) && 
				!StringUtil.isEmpty(userName) && !StringUtil.isEmpty(userEmail))
		{
			if(userDao.userIdSelectCount(userId) > 0)
			{
				//중복아이디 존재
				msg = "사용자 아이디가 존재 합니다.";
				redirectUrl = "/user/userRegForm";
			}
			else
			{
				//회원 가입
				User user = new User();
				
				user.setUserId(userId);
				user.setUserPwd(userPwd);
				user.setUserName(userName);
				user.setUserEmail(userEmail);
				user.setStatus("Y");
				
				if(userDao.userInsert(user) > 0)
				{
					msg = "회원가입이 완료 되었습니다.";
					redirectUrl = "/";
				}
				else
				{
					msg = "회원가입중 오류가 발생했습니다.";
					redirectUrl = "/user/userRegForm.jsp";
				}
			}
		}
		else
		{
			msg = "회원가입 중 입력값이 잘 못 되었습니다.";
			redirectUrl = "/user/userRegForm.jsp";
		}
			
	}
	else
	{	//값이 비어있지 않으면
		//회원 정보 수정
		User user = userDao.userSelect(cookieUserId);
		//받아 놓은 쿠키 아이디
		//해당 아이디가 갖고 있는 레코드를 user 객체가 가지고 있음
		
		if(user != null)
		{
			//user.getUserId()값이랑 파라미터 값이랑 같냐?
			if(StringUtil.equals(user.getUserId(), userId) && 
					StringUtil.equals(user.getStatus(), "Y"))
			{
				if(!StringUtil.isEmpty(userId) && !StringUtil.isEmpty(userPwd) &&
						!StringUtil.isEmpty(userName) && !StringUtil.isEmpty(userEmail))
				{
					//값이 넘어 왔는지 확인
					//정상적일 때
					//리퀘스트를 이용해서 넘어 온 값으로 대체를 해줘야함
					user.setUserPwd(userPwd);
					user.setUserName(userName);
					user.setUserEmail(userEmail);
					//Id가 없는 이유는 바꿀 필요 없으니까
					//원래는 DB의 정보와 바뀐 정보와 다를 때 수정이 되도록 해야하는데
					//지금 이 코드는 아무런 값이 바뀌지 않아도 수정이 되도록 구동이 된다.
					//user.로 돼 있는 것은 기존에 있던 회원정보임
					if(userDao.userUpdate(user) > 0)
					{
						//정상처리
						msg = "회원정보가 수정되었습니다.";
						redirectUrl = "/user/userUpdateForm.jsp";
					}
					else
					{
						msg = "회원 정보 수정중 오류가 발생하였습니다.";
						redirectUrl = "/user/userUpdateForm.jsp";
					}
				}
				else
				{
					msg = "회원 정보 중 값이 올바르지 않습니다.";
					redirectUrl = "/user/userUpdateForm.jsp";
				}
			}
			else
			{
				CookieUtil.deleteCookie(request, response, "USER_ID");
				
				msg = "올바른 사용자가 아닙니다.";
				redirectUrl = "/"; 
				//아래에서 그대로 복사
			}
		}
		else
		{
			CookieUtil.deleteCookie(request, response, "USER_ID");
			
			msg = "올바른 사용자가 아닙니다.";
			redirectUrl = "/"; //로그인페이지
		}
	}
%>
<!DOCTYPE html>
<html>
<head>
<%@ include file="/include/head.jsp" %>
<script type="text/javascript">
$(document).ready(function() {
   alert("<%=msg%>");
   location.href = "<%=redirectUrl%>";
});   
</script>
</head>
<body>

</body>
</html>

 

 

수정 버튼을 누르면 회원정보가 수정 되면서 SQL 테이블에 담겨 있는 회원정보도 수정이 된다.