반응형

# MVC06_06 회원 로그인 화면처리

## 개발자 도구_세션 확인

  • 크롬 개발자 도구(F12) 실행, MVC06 작업내용을 바탕으로 세션 확인

  • 개발자 도구(F12) 실행 된 상태에서 http://localhost:8081/MVC06/memberList.do 진입 후 Network 탭에 Response Headers 확인해 보면 Set-Cookie에 JSESSIONID 존재.

  • 해당 브라우저에서 두번 째 요청 시 Network 탭에 Request headers 확인해 보면 Cookie에 JSESSIONID 존재. 

## MVC06 회원 로그인 세션 이용_로그인(회원인증)에 따른 화면 작업

  • 회원 로그인 전(회원 인증 전)에는 로그인 폼이 나오고, 회원 로그인 완료(회원 인증 성공)에는 로그인 폼 보이도록 설정

### MemberLoginController

  • 로그인 성공에 따른 인증여부 설정

1. 방법1_session.setAttribute();

if (user_name != null && !"".equals(user_name)) {	
  // 로그인 성공 -> 객체 바인딩.
  HttpSession session = request.getSession();		// 세션을 가져와서 설정하는 코드로 아래 코드와 동일. 
  session.setAttribute("userId", user_id);
  session.setAttribute("userName", user_name);
} else {	
  // 로그인 실패 -> 객체 바인딩, 실패 메시지
  request.getSession().setAttribute("userId", user_id);
  request.getSession().setAttribute("userName", user_name);
  request.getSession().setAttribute("msg", "사용자 정보가 올바르지 않습니다.");
}

2. 방법2_request.setAttribute();

if (user_name != null && !"".equals(user_name)) {	
  // 로그인 성공 -> 객체 바인딩.
  request.setAttribute("userId", user_id);
  request.setAttribute("userName", user_name);
} else {	
  // 로그인 실패 -> 객체 바인딩, 실패 메시지
  request.getSession().setAttribute("userId", user_id);
  request.getSession().setAttribute("userName", user_name);
  request.getSession().setAttribute("msg", "사용자 정보가 올바르지 않습니다.");
}

### memberList.jsp

  • MemberLoginController 에서 방법1_session.setAttribute();로 로그인 인증값 담은 경우 -> jsp에서 sessionScope로 값 가져오기
sessionScope.userId 로 진행

<c:if test="${sessionScope.userId}">
  <form class="form-inline" action="${ctx}/memberLogin.do" method="post">
    <div class="form-group">
      <label for="user_id">ID:</label>
      <input type="text" class="form-control" id="user_id" name="user_id">
    </div>
    <div class="form-group">
      <label for="pwd">Password:</label>
      <input type="password" class="form-control" id="password" name="password">
    </div>
    <button type="submit" class="btn btn-default" onclick="return check()">로그인</button>
  </form>
</c:if>
  • MemberLoginController 에서 방법2_request.setAttribute();로 로그인 인증값 담은 경우 -> jsp에서 requestScope로 값 가져오기
requestScope.userId 로 진행

<c:if test="${requestScope.userId}">
  <form class="form-inline" action="${ctx}/memberLogin.do" method="post">
    <div class="form-group">
      <label for="user_id">ID:</label>
      <input type="text" class="form-control" id="user_id" name="user_id">
    </div>
    <div class="form-group">
      <label for="pwd">Password:</label>
      <input type="password" class="form-control" id="password" name="password">
    </div>
    <button type="submit" class="btn btn-default" onclick="return check()">로그인</button>
  </form>
</c:if>

1. 로그인 전 화면

2. 로그인 성공 화면

## 본인 정보만 삭제 버튼 표시되도록 변경 작업

  • 로그인 정보에 따라 삭제 버튼 사용/미사용 될 수 있도록 작업
<c:if test="${sessionScope.userId == vo.id}">
	<td><input type="button" value="삭제" class="btn btn-warning" onclick="deleteFn(${vo.num})"></td>
</c:if>
<c:if test="${sessionScope.userId != vo.id}">
	<td><input type="button" value="삭제" class="btn btn-warning" onclick="deleteFn(${vo.num})" disabled="disabled"></td>
</c:if>

1. 로그인 전 (삭제 버튼 모두 비 활성화)

2. 로그인 시 (본인 것만 삭제 버튼 활성화)

 

# MVC06_07 회원 로그아웃

## memberList.jsp

  • 로그아웃 버튼 클릭 시 function logout() 실행하여 memberLogout.do 실행.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="kr.bit.model.*" %>    
<%@ page import="java.util.*" %>
<%
     // ArrayList<MemberVO> list=(ArrayList<MemberVO>)request.getAttribute("list");
%>    
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css'>
<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js'></script>
<script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js'></script>
<script type="text/javascript">

	$(document).ready(function(){
		<c:if test="${!empty msg}">
			alert("${msg}");
			<c:remove var="msg" scope="session"/>
		</c:if>
	});

	function deleteFn(num) {
		location.href="${ctx}/memberDelete.do?num="+num; // ?num=12
	}
	
	function check() {
		if ($('#user_id').val() == '') {
			alert("아이디를 입력해주세요.");
			return false;
	 	}
		
		if ($('#password').val() == '') {
			alert("비밀번호를 입력해주세요.");
			return false;
		}
		
		return true;
	}
	
	function logout() {
		location.href="<c:url value='/memberLogout.do'/>";
	}
</script>
</head>
<body>

<div class="container">
	<h2>회원관리 시스템</h2>
	<div class="panel panel-default">
		<div class="panel-heading">
		<c:if test="${sessionScope.userId == null || sessionScope.userId == ''}">
			<form class="form-inline" action="${ctx}/memberLogin.do" method="post">
			    <div class="form-group">
					<label for="user_id">ID:</label>
					<input type="text" class="form-control" id="user_id" name="user_id">
			    </div>
			    <div class="form-group">
					<label for="pwd">Password:</label>
					<input type="password" class="form-control" id="password" name="password">
			    </div>
			    <button type="submit" class="btn btn-default" onclick="return check()">로그인</button>
			</form>
		</c:if>
		<c:if test="${sessionScope.userId != null && sessionScope.userId != ''}">
			${sessionScope.userName}님 환영합니다.
			<button type="submit" class="btn btn-warning" onclick="logout()" >로그아웃</button>
		</c:if>	
		</div>
	<div class="panel-body">
		<div class="table-responsive">          
			<table class="table table-hover">
			<thead>
				<tr>
					<th>번호</th>
					<th>아이디</th>
					<th>비밀번호</th>
					<th>이름</th>
					<th>나이</th>
					<th>이메일</th>
					<th>전화번호</th>
					<th>삭제</th>
				</tr>
			</thead>
			<tbody>
				<c:forEach var="vo" items="${list}">
				<tr>
		    	    <td>${vo.num}</td>
		    	    <td><a href="${ctx}/memberContent.do?num=${vo.num}">${vo.id}</a></td>
		    	    <td>${vo.pass}</td>
		    	    <td>${vo.name}</td>
		    	    <td>${vo.age}</td>
		    	    <td>${vo.email}</td>
		    	    <td>${vo.phone}</td>
		    	    <c:if test="${sessionScope.userId == vo.id}">
		    	    	<td><input type="button" value="삭제" class="btn btn-warning" onclick="deleteFn(${vo.num})"></td>
		    	    </c:if>
		    	    <c:if test="${sessionScope.userId != vo.id}">
		    	    	<td><input type="button" value="삭제" class="btn btn-warning" onclick="deleteFn(${vo.num})" disabled="disabled"></td>
		    	    </c:if>
				</tr>    	 
				</c:forEach>
				<tr>
					<td colspan="8" align="right"><input type="button" value="회원가입" class="btn btn-primary" onclick="location.href='${ctx}/memberRegister.do'"/></td>			  
				</tr>
			</tbody>
			</table>
		</div>
	</div>
	<div class="panel-footer">
		회원관리 ERP System(admin@naver.com)
	</div>
	</div>
</div>
</body>
</html>

## HandlerMapping

  • memberLogout.do 에 따른 HandlerMapping 추가.
package kr.bit.frontcontroller;

import java.util.HashMap;

import kr.bit.controller.Controller;
import kr.bit.controller.*;

public class HandlerMapping {
  private HashMap<String, Controller> mappings;
  public HandlerMapping() {
	  mappings=new HashMap<String, Controller>();
	  mappings.put("/memberList.do", new MemberListController());
	  mappings.put("/memberInsert.do", new MemberInsertController());
	  mappings.put("/memberRegister.do", new MemberRegisterController());
	  mappings.put("/memberContent.do", new MemberContentController());
	  mappings.put("/memberUpdate.do", new MemberUpdateController());
	  mappings.put("/memberDelete.do", new MemberDeleteController());
	  mappings.put("/memberLogin.do", new MemberLoginController());
	  mappings.put("/memberLogout.do", new MemberLogoutController());
  }
  public Controller getController(String key) { // key=>/memberList.do
	  return mappings.get(key);
  }
}

## MemberLogoutController 생성

  • 프로젝트 > src > kr.bit.controller > class 클릭 후 MemberLogoutController 이름의 컨트롤러 생성
package kr.bit.controller;

import java.io.IOException;

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

public class MemberLogoutController implements Controller {

	@Override
	public String requestHandler(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		String ctx = request.getContextPath();
		
		// 세션을 가져와서 세션 제거
		// 세션을 제거하는 방법
		// 1. 강제로 세션 제거
		request.getSession().invalidate();	
		// 2. 브라우저 강제 종료(JSESSIONID 브라우저 쿠키에 저장)
		// 3. 세션이 종료될때까지 기다리는 것.(세션 타임아웃 : 기본 30분 = 1800초)
		
		return "redirect:" + ctx + "/memberList.do";
	}

}

### 세션을 제거하는 방법

1. 세션을 강제로 제거하는 방법

2. 브라우저 강제 종료(JSESSIONID 브라우저 쿠키에 저장)

3. 세션이 종료될때까지 기다리는 것.(세션 타임아웃 : 기본 30분 = 1800초)

  • 세션 타임아웃의 경우 Servers > 톰캣 > web.xml에 아래와 같이 설정되어있다.
  <!-- ==================== Default Session Configuration ================= -->
  <!-- You can set the default session timeout (in minutes) for all newly   -->
  <!-- created sessions by modifying the value below.                       -->

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

## 회원정보 삭제한 경우에도 로그아웃 될 수 있도록 작업

  • MemberDeleteController 에 세션 제거 코드 추가.
package kr.bit.controller;

import java.io.IOException;

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

import kr.bit.model.MemberDAO;

public class MemberDeleteController implements Controller{

	@Override
	public String requestHandler(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		String ctx=request.getContextPath(); // /MVC04
		
		int num=Integer.parseInt(request.getParameter("num"));
		
		MemberDAO dao=new MemberDAO();
		int cnt=dao.memberDelete(num);
		String nextPage=null;
		if(cnt>0) {
			request.getSession().invalidate();
			nextPage="redirect:"+ctx+"/memberList.do";
		}else {
			throw new ServletException("not delete");	
		}		
		return nextPage;
	}

}

 

반응형
반응형

# MVC06_03 세션이란 무엇인가_1 (request 바인딩의 한계)

  • 클라이언트가 로그인 시 회원인증컨트롤러에서 로그인한 정보를 검토하여 회원 인증 로그인 성공/실패 처리. 이때 로그인 성공 여부를 특정 메모리에 기록
  • 회원 인증이 성공한 후에 서비스가 진행되는데, A.jsp, B.jsp, C.jsp가 존재할 때 로그인 성공여부를 알 수 있는 방법은 위에서 특정 메모리에 기록한 내용을 바탕으로 확인 할 수 있다.

1. 문제점

  • A.jsp, B.jsp, C.jsp 페이지는 회원 인증이 성공한 후에 서비스가 진행되어야 하는데... 그런데 회원인증 페이지를 거치지 않고 A.jsp, B.jsp, C.jsp 페이지에 접근하는 경우(URL에 해당 페이지로 바로 접근)도 발생할 수 있다. 
  • 그래서 A.jsp, B.jsp, C.jsp 페이지에는 페이지 상단 부분에 회원인증여부를 판단(체크)할 수 있는 코드가 들어가 있어야 한다.
  • 특정 메모리에 기록한 내용을 HttpServletRequest 이용 객체 바인딩하게 되면 RequestDispatcher rd = request.getRequestDispatcher(); 로 포워딩 하게 되는데, 이렇게 되면 A.jsp 또는 B.jsp 또는 C.jsp 각 하나의 페이지에서먼 회원인증을 체크할 수 있다. 

2. 해결방법

  • HttpServletRequest 객체를 이용해서는 해결이 되지 않으나, HttpSession 객체를 이용하면 회원인증 여부를 여러 페이지에서 확인할 수있다.

## 세션에 로그인 대상 정보 넣기

  • 회원 로그인 기능에서 로그인 성공 시 세션에 아래와 같이 로그인 정보를 담는다.
1. 세션에 로그인 정보 설정 방법 1.
HttpSession session = request.getSession();		// 세션을 가져와서 
session.setAttribute("userId", user_id);
session.setAttribute("userName", user_name);

2. 세션에 로그인 정보 설정 방법 2.
request.getSession().setAttribute("userId", user_id);
request.getSession().setAttribute("userName", user_name);

위 2가지 방법은 모두 동일한 코드.

 

# MVC06_04 세션이란 무엇인가_2

## 세션

1. 초기 방문 시

  • 클라이언트가 서버에 요청해서 서버에 접속하면 서버에 해당 클라이언트에 대한 정보가 서버의 특정 공간에 남게 되고, 클라이언트를 식별하기 위해 서버에서 정보(접속 아이디, 비밀번호 등 식별정보)가 담긴 쿠키(흔적, 쿠키 정보는 브라우저캐쉬메모리에 저장)를 넘긴다. 이때 서버와 클라이언트를 연결해주는 세션이 존재.

2. 두번째 방문 시

  • 클라이언트가 서버에 요청 시 클라이언트에서 만들어졌던 쿠키 정보를 서버쪽에서 가져와야 하는데, 이때 서버에서는 reqeust 객체에 해당 쿠키 정보가 담기게 된다.
  • 그래서 클라이언트와 서버간에 쿠키정보를 이용하여 식별 하게 된다.

 

# MVC06_05 세션이란 무엇인가_3

## 세션 (프로그램적으로 설명)

  • 세션은 고유한 연결라인.
  • 동일한 브라우저에서의 요청인 경우에는 세션이 동일(세션 유지)하다.

1. 초기 방문 시

  • 클라언트가 서버에 처음 방문 시, 서버는 클라이언트를 식별하기 위해 HttpSession 객체(메모리 공간)를 생성하고 해당 클라이언트가 사용할 수 있도록 고유한 번호인 SessionId 생성(영숫자의 조합 32자) 한다.
  • 그리고 생성된 SessionId를 접속한 클라이언트에게 전달 한다. (이 값이 바로 쿠키Cookie, 브라우저로 접속했을 경우 쿠키는 브라우저 메모리에 저장 된다.)
  • 서버에서 해당 클라이언트가 처음 접속 하는건지 두번째 접속하는 건지는 클라이언트로부터 넘어오는 값으로 판단.

2. 두번째 방문 시

  • 클라이언트가 서버에 방문 시 쿠키 값이 서버로 넘어가게 된다.
  • 그래서 클라이언트와 서버간에 쿠키정보를 이용하여 식별하게 된다.

## 추가 설명

1. request.getSession();

  • 클라이언트 접속 시 클라이언트에서 넘어오는 쿠키값 존재 여부 확인을 위해 HttpSession session = request.getSession(); 진행.
  • 클라이언트로부터 넘어오는 값이 존재하면 HttpServletRequest에 해당 쿠키 값이 담기게 되고, 서버는 HttpSession session = request.getSession(); 으로 HttpServletRequest에 존재하는 쿠키 값을 가리킨다.
  • 클라이언트로부터 넘어오는 값이 존재하지 않으면 HttpSession 객체를 생성하고 여기에 고유한 아이디 값(SessionId) 을 생성하게 된다. 그래서 해당 쿠키값을 클라이언트에게 내려보내주면 클라이언트와 서버의 세션(고유한 라인)이 성립되게 된다.

2. 객체 바인딩

  • 회원 인증 성공에 대한 사실을 계속 추적할 수 있도록 session.setAttribute로 객체 바인딩을 진행.
반응형
반응형

# MVC06_01 회원 로그인 페이지 작성

## MVC05 WAR File Import

  • 기존에 작업 진행한 MVC05 Import하여 MVC06으로 이름 변경 작업 진행.

MVC05.war
2.66MB

  • Project Explorer 빈 공간 우 클릭 > Import > MVC05.WAR 찾아서 클릭 후 Finish.

## Context 등록

  • 웹 애플리케이션을 WAS 톰캣 Server가 인식할 수 있도록 등록.
  • 톰캣 서버 우 클릭 > Add and Remove 에서 Available 에 존재하는 MVC04 클릭 후 Add 하여 Configured로 등록 후 Finish.

## 작업 계획

  • 회원 로그인 구현
  • 회원 로그인 시 본인의 정보 삭제 버튼 표시, 상세 보기 시 본인의 저보 수정하기 버튼 표시

## 회원 로그인 페이지 작업

<div class="container">
  <h2>Panel Heading</h2>
  <div class="panel panel-default">
    <div class="panel-heading">Panel Heading</div>
    <div class="panel-body">Panel Content</div>
  </div>
</div>
  • 로그인 폼은 부트 스트랩 Inline Form 사용
<div class="container">
  <h2>Inline form</h2>
  <p>Make the viewport larger than 768px wide to see that all of the form elements are inline, left aligned, and the labels are alongside.</p>
  <form class="form-inline" action="/action_page.php">
    <div class="form-group">
      <label for="email">Email:</label>
      <input type="email" class="form-control" id="email" placeholder="Enter email" name="email">
    </div>
    <div class="form-group">
      <label for="pwd">Password:</label>
      <input type="password" class="form-control" id="pwd" placeholder="Enter password" name="pwd">
    </div>
    <div class="checkbox">
      <label><input type="checkbox" name="remember"> Remember me</label>
    </div>
    <button type="submit" class="btn btn-default">Submit</button>
  </form>
</div>
  • Panel body에는 부트 스트랩 Responsive Tables 사용
<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Table</h2>
  <p>The .table-responsive class creates a responsive table which will scroll horizontally on small devices (under 768px). When viewing on anything larger than 768px wide, there is no difference:</p>                                                                                      
  <div class="table-responsive">          
  <table class="table">
    <thead>
      <tr>
        <th>#</th>
        <th>Firstname</th>
        <th>Lastname</th>
        <th>Age</th>
        <th>City</th>
        <th>Country</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>1</td>
        <td>Anna</td>
        <td>Pitt</td>
        <td>35</td>
        <td>New York</td>
        <td>USA</td>
      </tr>
    </tbody>
  </table>
  </div>
</div>

</body>
</html>
  • 부트 스트랩 Panel Footer 사용
<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
 
<div class="container">
  <h2>Panel Footer</h2>
  <div class="panel panel-default">
    <div class="panel-heading">Panel Heading</div>
    <div class="panel-body">Panel Content</div>
    <div class="panel-footer">Panel Footer</div>
  </div>
</div>

</body>
</html>

 

# MVC06_02 회원 로그인 기능(세션 바인딩)

## 회원 로그인 기능 작업

1. 입력값 유효성 검사

  • 아이디, 비밀번호 입력 시 알림창 표시될 수 있도록 이벤트 설정. (자바스크립트로 유효성 검사 설정)
<script type="text/javascript">
  function check() {
	  if ($('#user_id').val() == '') {
		 alert("아이디를 입력해주세요.");
		 return false;
	  }
	  
	  if ($('#password').val() == '') {
		 alert("비밀번호를 입력해주세요.");
		 return false;
	  }
	  
	  return true;
  }
</script>



<h2>회원관리 시스템</h2>
	<div class="panel panel-default">
		<div class="panel-heading">
			<form class="form-inline" action="${ctx}/memberLogin.do" method="post">
			    <div class="form-group">
					<label for="user_id">ID:</label>
					<input type="text" class="form-control" id="user_id" name="user_id">
			    </div>
			    <div class="form-group">
					<label for="pwd">Password:</label>
					<input type="password" class="form-control" id="password" name="password">
			    </div>
			    <button type="submit" class="btn btn-default" onclick="return check()">로그인</button>
			</form>
		</div>
	</div>

2. HandlerMapping

  • 로그인 클릭 시 action 에 따른 HandlerMapping
package kr.bit.frontcontroller;

import java.util.HashMap;

import kr.bit.controller.Controller;
import kr.bit.controller.*;

public class HandlerMapping {
  private HashMap<String, Controller> mappings;
  public HandlerMapping() {
	  mappings=new HashMap<String, Controller>();
	  mappings.put("/memberList.do", new MemberListController());
	  mappings.put("/memberInsert.do", new MemberInsertController());
	  mappings.put("/memberRegister.do", new MemberRegisterController());
	  mappings.put("/memberContent.do", new MemberContentController());
	  mappings.put("/memberUpdate.do", new MemberUpdateController());
	  mappings.put("/memberDelete.do", new MemberDeleteController());
	  mappings.put("/memberLogin.do", new MemberLoginController());
  }
  public Controller getController(String key) { // key=>/memberList.do
	  return mappings.get(key);
  }
}

3. MemberLoginController 생성

package kr.bit.controller;

import java.io.IOException;

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

import kr.bit.model.MemberDAO;
import kr.bit.model.MemberVO;

public class MemberLoginController implements Controller {

	@Override
	public String requestHandler(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		String ctx = request.getContextPath();		
		
		String user_id = request.getParameter("user_id");
		String password = request.getParameter("password");
		
		MemberVO vo = new MemberVO();
		vo.setId(user_id);
		vo.setPass(password);

		MemberDAO dao = new MemberDAO();
		String user_name = dao.memberLogin(vo);
		
		if (user_name != null && !"".equals(user_name)) {	
			// 로그인 성공 -> 객체 바인딩.
			request.getSession().setAttribute("userId", user_id);
			request.getSession().setAttribute("userName", user_name);
		} else {	
			// 로그인 실패 -> 객체 바인딩, 실패 메시지
			request.getSession().setAttribute("userId", user_id);
			request.getSession().setAttribute("userName", user_name);
			request.getSession().setAttribute("msg", "사용자 정보가 올바르지 않습니다.");
		}
		
		return "redirect:" + ctx + "/memberList.do";
	}

}

4. MemberDAO

// 회원 로그인
public String memberLogin(MemberVO vo) {
  SqlSession session = sqlSessionFactory.openSession();
  String user_name = session.selectOne("memberLogin", vo);
  session.close();
  return user_name;
}

5. MemberMapper.xml

<!-- 회원 로그인 -->
<select id="memberLogin" parameterType="memberVO" resultType="String">
  SELECT name
  FROM member
  WHERE id = #{id}
  AND  pass = #{pass}
</select>
반응형
반응형

# MVC05_05 마무리

## JDBC를 MyBatis로 변경

1. JDBC의 문제점

  • 중요한 정보가 소스코드에 노출
  • 자바 소스코드와 SQL 문장이 혼합된 형태, 이로인해 유지보수에 문제점 발생 가능성
  • 개발속도가 느림(개발자가 모든 코드를 직접 만들어야 한다.)

2. SQL Mapping Framework의 이해

  • MyBatis는 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 조금 더 쉽게 할 수 있도록 도와주는 개발 프레임워크.
  • MyBatis는 JDBC를 통해서 데이터베이스에 액세스하는 작업을 캡슐화, 일반 SQL 쿼리, 저장 프로시저, 고급 매핑을 지원하고 모든 JDBC 코드 및 매개 변수의 중복 작업을 제거한다.
  • SQL쿼리들을 한 구성파일에 구성하여 SQL 쿼리와 프로그램 코드를 분리할 수 있는 장점이 존재.

3. MyBatis 환경설정 파일(3개)

  • MyBatis configuration File (XML - config.xml) :MyBatis3의 작업 설정을 설명하는 XML 파일
  • Mapper File (XML - mapper.xml) : SQL 쿼리를 작성하는 파일
  • Properties File (db.properties) :데이터베이스 연결정보를 기술하는 파일 (url, user, password)

4. SqlSessionFactory, SqlSession 이해

  • SqlSessionFactoryBuilder : MyBatis 환경설정 파일을 읽어서 SqlSessionFactory를 구성하는 요소로 Connection Pool을 만든다.
  • SqlSessionFactory : SqlSessionFactoryBuilder에 의해 만들어지는 객체로, SqlSession을 구성하는 요소(Connection Pool) 이다.
  • SqlSession : 데이터베이스에 액세스할 때 가장 중요한 역할을 한다. JDBC의 Connection + Statement 역할을 복합적으로 지닌 존재.

5. Connection Pool 개념 이해

SqlSessionFactoryBuilderSqlSessionFactory XML을 읽어들여서 최종적으로 메모리에 SqlSessionFactory를 생성, 해당 SqlSessionFactory 안에는 Connection Pool이 구성되어있다.

미리 데이터베이스에 접속할 수 있는 연결 객체를 여러개 만들어 두고 데이터베이스의 성능을 개선하기 위해 Connection Pool  구성해서 사용한다.

반응형

+ Recent posts