웹 Web/MVC 패턴

MVC 패턴으로 CRUD 구현 (2) - session

하나비 HANABI 2023. 2. 10. 17:47

<추가된 것들>

로그인과 로그아웃 (세션 활용)

메인 홈페이지

아이돌(관리자, 특정 아이디)만 회원리스트 조회 가능

메인 페이지 (쿼리스트링으로 cmd를 주지 않아도 띄울 수 있게)
관리자는 회원리스트를 조회 가능
일반 사용자는 회원리스트 조회 불가

 

Session이란?

https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpSession.html

 

HttpSession (Java(TM) EE 7 Specification APIs)

Provides a way to identify a user across more than one page request or visit to a Web site and to store information about that user. The servlet container uses this interface to create a session between an HTTP client and an HTTP server. The session persis

docs.oracle.com

둘 이상의 페이지 요청 또는 웹 사이트 방문에서 사용자를 식별하고 해당 사용자에 대한 정보를 저장하는 방법을 제공한다.

서블릿 컨테이너는 이 인터페이스를 사용하여 HTTP 클라이언트와 HTTP 서버 간의 세션을 만든다. 

세션은 사용자의 둘 이상의 연결 또는 페이지 요청에서 지정된 기간 동안 지속된다. 

세션은 일반적으로 사이트를 여러 번 방문할 수 있는 한 명의 사용자에 해당한다.

 

우린 페이지와 페이지를 연결하여 원하는 목적을 달성하려함.

그러나 http는 상태가 없고, 네트워크라서 요청에 대한 응답임. 한번 접속해서 요청 처리 후에 바로 끊어버림(이전에 넘겨준 데이터를 찾아오지 못함).

이러한 문제로 인해 세션이 등장 -> 특정 사용자가 특정 기간에 자신이 했던 작업을 저장하는 곳.

 

데이터 저장의 범위 : page < request < session < application

 


 

home.jsp

<%@page import="bitedu.member.vo.MemberVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Home</title>
<script src="../js/Home.js"></script>
</head>
<body>
<%
	String logInOut = "<a href='./mController?cmd=viewLoginForm'>로그인</a>";
	String msg = "로그인하세요";
	String listLink = "";
	
	// 세션 검사
	MemberVO vo = (MemberVO) session.getAttribute("vo");
	if(vo != null) {
		logInOut = "<a href='./mController?cmd=logout'>로그아웃</a>";
		msg = vo.getName() + "님 반갑습니다.";
		
		if(vo.getId().equals("taehyun") || vo.getId().equals("beomgyu")) {
			listLink = "<a href='./mController?cmd=readAll'>회원리스트</a>";
		} else {
			listLink = "<a href=\"javascript:alert('일반 회원은 접근할 수 없습니다.');\">회원리스트</a>";
		}
	}
%>
<h1>홈페이지</h1>
<span><%= logInOut %></span>
<span><%= msg %></span>
<span><%= listLink %></span>
</body>
</html>

 

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>
<form action="./mController?cmd=login" method="post">
	<table>
		<tr>
			<td>아이디</td>
			<td><input type="text" name="id"></td>
		</tr>
		<tr>
			<td>비밀번호</td>
			<td><input type="password" name="pwd"></td>
		</tr>
	</table>
	<input type="submit" value="로그인">
</form>
</body>
</html>

 

MemberServlet.jsp 의 doPost() 

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
    							throws ServletException, IOException {
		req.setCharacterEncoding("UTF-8");
		String cmd = req.getParameter("cmd");
		String url = "./mController?cmd=readAll";
		
		if(cmd == null) {
			cmd = "home";
		}
		
		/* 전체 조회 */
		if(cmd.equals("readAll")) {
			System.out.println("--- read All ---");
			
			ArrayList<MemberVO> voList = service.findAll();
			req.setAttribute("voList", voList);
			url = "./member/list.jsp";
		/* 상세 조회 */
		} else if(cmd.equals("search")) {
			System.out.println("--- search ---");
			
			String id = req.getParameter("id");
			MemberVO vo = service.find(id);
			
			req.setAttribute("vo", vo);
			url = "./member/detail.jsp";
			
		/* 가입폼 */ 
		} else if(cmd.equals("viewRegistForm")) {
			System.out.println("--- viewRegistForm ---");
			url = "./member/regist.jsp";
			
		/* 가입 */
		} else if(cmd.equals("regist")) {
			System.out.println("--- regist ---");
			
			String id = req.getParameter("id");
			String pwd = req.getParameter("pwd");
			String name = req.getParameter("name");
			String email = req.getParameter("email");
			Timestamp registDate = new Timestamp(System.currentTimeMillis());
			
			MemberVO vo = new MemberVO(id, pwd, name, email, registDate);
			
			boolean flag = service.regist(vo);
			if(flag == false) {
				url = "./member/errorResult.jsp";
			}
			
		/* 수정폼 */
		} else if(cmd.equals("viewUpdateForm")) {
			System.out.println("--- view update form ---");
			
			String id = req.getParameter("id");
			MemberVO vo = service.find(id);
			req.setAttribute("vo", vo);
			url = "./member/update.jsp";
			
		/* 수정 */
		} else if(cmd.equals("update")) {
			System.out.println("--- update ---");
			
			String id = req.getParameter("id");
			String pwd = req.getParameter("pwd");
			String name = req.getParameter("name");
			String email = req.getParameter("email");
			
			MemberVO vo = service.find(id);
			vo.setPwd(pwd);
			vo.setName(name);
			vo.setEmail(email);
			
			boolean flag = service.modify(vo);
			if(flag == false) {
				url = "./member/errorResult.jsp";
			}
			
		/* 삭제 */
		} else if(cmd.equals("delete")) {
			System.out.println("--- delete ---");
			
			String id = req.getParameter("id");
			boolean flag = service.remove(id);
			if(flag == false) {
				url = "./member/errorResult.jsp";
			}
			
		/* 로그인 창 */
		} else if(cmd.equals("viewLoginForm")) {
			System.out.println("--- view Login Form ---");
			url = "./login/login.jsp";
			
		/* 로그인 */
		} else if(cmd.equals("login")) {
			System.out.println("--- Login ---");
			
			String id = req.getParameter("id");
			String pwd = req.getParameter("pwd");
			
			MemberVO vo = service.isMember(id, pwd);
			if(vo != null) {
				HttpSession session = req.getSession();
				session.setAttribute("vo", vo);
				url = "./login/home.jsp";
			} else {
				url = "./login/login.jsp";
			}
			
		/* 로그아웃 */
		} else if(cmd.equals("logout")) {
			HttpSession session = req.getSession();
			session.invalidate();
			url = "./login/home.jsp";
			
		/* 메인 */
		} else if(cmd.equals("home")) {
			System.out.println("--- home ---");
			url = "./login/home.jsp";
			
		}
		
		RequestDispatcher rd = req.getRequestDispatcher(url);
		rd.forward(req, resp);
		
	}

 

MemberService.jsp 추가된 메소드

	/* 비즈니스 로직 : 로그인 */
	public MemberVO isMember(String id, String pwd) {
		
		MemberVO vo = null;
		try {
			vo = dao.selectMember(id, pwd);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return vo;
	}

 

MemberDAO.jsp 추가된 메소드

	/* 아이디, 패스워드로 멤버 조회 */
	public MemberVO selectMember(String id, String pwd) throws SQLException {
		sql = "select * from membertbl where id=? and pwd=?";
		
		con = ConnectionManager.getConnection();
		pstmt = con.prepareStatement(sql);
		pstmt.setString(1, id);
		pstmt.setString(2, pwd);
		rs = pstmt.executeQuery();
		
		MemberVO vo = null;
		while(rs.next()) {
			vo = new MemberVO(rs.getString(1), rs.getString(2), rs.getString(3), 
            				rs.getString(4), rs.getTimestamp(5));
		}
		
		ConnectionManager.closeConnection(rs, pstmt, con);
		return vo;
	}