Flaming Soccer ball
통합

54일차-1 22.12.06 사용자 정보 수정

leo lee 2022. 12. 6.
반응형

사용자 정보 수정 같은 경우에는 로직이 완벽 하진 않지만 주로 쓰이는 방식이라 응용한다면 우리가 평소 보는 정보수정으로 만들 수 있을 것 같다.

 

회원 정보 수정 같은 경우에는 기존의 회원가입의 형식을 사용하면 된다. 현재는 수정이 되는 것이 아니라 기존에 회원 정보를 입력창에 넣어주는 기능을 만들었다.

 

회원 데이터를 가지고 나오는 작업의 순서는 아래와 같다.


 * service와 dao에 getInfo()메서드를 선언
 * service에서는 세션에서 아이디를 얻는다
 * dao에서는 id를 전달받아 회원 데이터를 조회하여 vo에 저장
 * controller에서는 조회한 vo를 저장하고 화면으로 가지고 나감
 * 화면에서는 input태그에 값을 출력

 

package com.example.user.service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.example.user.model.UserVO;

public interface UserService {
	public int join(HttpServletRequest request, HttpServletResponse response);
	public UserVO login(HttpServletRequest request, HttpServletResponse response);
	public UserVO getInfo(HttpServletRequest request, HttpServletResponse response);

}

기존에 있던 service interface에 getInfo 메서드를 선언한다. Interface는 메뉴판이라고 생각하면 이해가 쉬울 것 같다.

 

	@Override
	public UserVO getInfo(HttpServletRequest request, HttpServletResponse response) {
		HttpSession session = request.getSession();//자바에서 현재 세션 얻는 방법
	
		String id = (String)session.getAttribute("user_id");

		
		UserVO vo = dao.getInfo(id);
		
		
		
		return vo;
	}

 오버라이딩을 통해서 메서드의 내용을 넣어준다. 이 경우에는 기존의 로그인을 하면서 session에 담아줬던 key값 user_id를 통해서 정보를 불러올 것이다.

 

public UserVO getInfo(String id) {
		UserVO vo = null;
		String sql = "select * from users where id = ?";
		
		try {
			conn = DriverManager.getConnection(URL,UID,UPW);			
			pstmt = conn.prepareStatement(sql);

			pstmt.setString(1, id);
			
			
			rs =pstmt.executeQuery();
			
			if(rs.next()) {//로그인 성공 후 vo에 회원정보 저장
				
				String id2 = rs.getString("id");
				String name = rs.getString("name");
				String email = rs.getString("email");
				String gender = rs.getString("gender");
				
				vo = new UserVO(id2, null, name, email, gender);
				
			}
		
		} catch (Exception e) {
			e.printStackTrace();
		}
		finally {
			JDBCUtil.close(conn, pstmt, rs);
		}
		return vo;
	}

DAO에도 getInfo 라는 메서드를 선언하여 데이터베이스 즉 SQL에 들어있는 데이터를 불러온다. SQL문 같은 경우에는 아래와 같이 선언하고 pstmt.setString(1,id)값을 통해서 설정해준다. 

select * from users where id =?;

이 과정을 통해서 필요한 값들을 vo에 값을 넣어준다.

 

최종적으로 controller에서 UserService의 getInfo메서드를 호출하여 객체를 request에 담아준다. 

case "/user/user_modify.user"://정보수정화면
			/*****회원 데이터를 가지고 나오는 작업*****
			 * service와 dao에 getInfo()메서드를 선언
			 * service에서는 세션에서 아이디를 얻는다
			 * dao에서는 id를 전달받아 회원 데이터를 조회하여 vo에 저장
			 * controller에서는 조회한 vo를 저장하고 화면으로 가지고 나감
			 * 화면에서는 input태그에 값을 출력
			 * */
			UserVO vo2 =  service.getInfo(request, response);
			request.setAttribute("vo2", vo2);
			System.out.println(vo2.getGender());
			request.getRequestDispatcher("user_modify.jsp").forward(request, response);
			
		default:
			break;
		}

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@include file="../include/header.jsp"%>
<%@taglib uri ="http://java.sun.com/jsp/jstl/core" prefix="c"%>   

<div align="center">
	<form action="joinForm.user" method="post">
		<span style="color: red;">${msg }</span>
		<table>
			<tr>
				<td>아이디</td>
				<td><input type="text" name="id" placeholder="4~8글자 영문자 숫자"
					pattern="\w{4,8}" required="required" value="${requestScope.vo2.id}"></td>
			</tr>

			<tr>
				<td>비밀번호</td>
				<td><input type="password" name="pw" pattern="\w{4,8}"
					required="required" value="${requestScope.vo2.pw}"></td>
			</tr>

			<tr>
				<td>이름</td>
				<td><input type="text" name="name" pattern="[가-힣]{3,}" value="${requestScope.vo2.name}">
				</td>
			</tr>

			<tr>
				<td>이메일</td>
				
				<td><input type="email" name="email" value="${requestScope.vo2.email}"></td>
			</tr>

			<tr>
				<td>성별</td>
				
				<td>
					<input type="radio" name="gender" value="f" ${requestScope.vo2.gender == 'f'? 'checked': ''}>여자 
					<input type="radio" name="gender" value="m" ${requestScope.vo2.gender == 'm'? 'checked': ''}>남자
				</td>
			</tr>

		</table>
		<input type="submit" value="정보수정"> <input type="button"
			value="마이페이지" onclick="location.href='user_mypage.user'">

	</form>
</div>


<%@include file="../include/footer.jsp"%>

${requestScope.request로 저장한 객체이름.불러올 변수명}을 통해서 input value에 담아주면 아래 처럼 출력이 된다.

 

 

유저 정보 수정을 통한 정보 업데이트 하기

서비스에서 update method를 생성해준다.

package com.example.user.service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.example.user.model.UserVO;

public interface UserService {

	public int update(HttpServletRequest request, HttpServletResponse response);
	
	
}
	@Override
	   public int update(HttpServletRequest request, HttpServletResponse response) {
	      
	      String id = request.getParameter("id");
	      String pw = request.getParameter("pw");
	      String name = request.getParameter("name");
	      String gender = request.getParameter("gender");
	      
	      UserDAO dao = UserDAO.getInstance();
	      int result = dao.update(id, pw, name, gender);
	      
	      if(result == 1) {
	         HttpSession session = request.getSession();
	         session.setAttribute("user_name", name);
	      }
	      
	      return result;
	   }

변경된 name의 값을 session에 다시 담아준다.

 

이후 controller에서 updateForm.user라는  URL을 통해 service의 update메서드 호출해 준다.

case "/user/updateForm.user" :
	         /*
	          * 회원정보를 업데이트하는 작업
	          * service와 dao에 update() 메서드를 생성
	          * service의 필요한 파라미터 값을 받는다(pw, name, gender) 조건절(id)
	          * dao에서 데이터를 전달받아서 업데이트를 실행
	          * 업데이트 이후에는 컨트롤러를 태워서 mypage로 리다이렉트 
	          */
			
			int result2 = service.update(request, response);
			if(result2==1) {//업데이트 성공
				
				//response.sendRedirect("user_mypage.user");
				response.setContentType("text/html; charset=utf-8");
				PrintWriter out = response.getWriter();
				out.println("<script>");
				out.println("alert('정보가 수정되었습니다');");
				out.println("location.href='user_mypage.user';");
				out.println("</script>");
				
			}else {// 업데이트 실패
				request.setAttribute("msg", "양식에 맞춰 작성해주세요");
				response.sendRedirect("user_modify.user");
				
				//out객체를 이용해서 화면에 스크립트를 작성해서 보냄
				
			}
	         
	      break;

Service에서는 DAO의 update 메서드를 호출하여 SQL 데이터베이스의 있는 기존의 내용을 수정해 준다. 

 

//정보 수정 
	public int update(String id, String pw, String name, String gender) {
		String sql = "update users set pw = ?, name = ? , gender = ? where id = ?";
		int result = 0;
		try {
			conn = DriverManager.getConnection(URL,UID,UPW);			
			pstmt = conn.prepareStatement(sql);

			pstmt.setString(1, pw);
			pstmt.setString(2, name);
			pstmt.setString(3, gender);
			pstmt.setString(4, id);
			
			
			result = pstmt.executeUpdate();
			
			
		
		} catch (Exception e) {
			e.printStackTrace();
		}
		finally {
			JDBCUtil.close(conn, pstmt, rs);
		}
		return result; 
		
	}

 

기존의 이름은 홍길동이다. 정보 수정을 통해서 리오리로 이름을 바꿔보자.

 

정보가 수정되었습니다라는 메세지와 함께 수정이 되고 최종 바뀐 이름으로 출력이 된다.

 

 

 

이렇게 비밀번호, 이름, 성별이 변경 가능하다.

반응형

댓글