본문 바로가기
코딩수업/AWS 클라우드환경 네이티브

11/11 웹 제작 - 로그아웃 / 회원 가입 / 회원 리스트 목록 / 회원 정보 수정, 삭제 / Redirect 와 Forward

by 인생즐겜러 2022. 11. 24.
728x90
반응형

AWS 클라우드환경 네이티브 수업 119 일차

 

 

 

진행

1. 웹 제작 - 로그아웃, 회원가입, 회원 리스트 목록

2. 웹 제작 - 회원정보 수정, 삭제 기능

 

 

 

 

 

요약

1. 웹 제작 - 로그아웃, 회원가입, 회원 리스트 목록

2. Redirect 와 Forward 

3. 웹 제작 - 회원정보 수정, 삭제 기능

 

 

 

 

 


 

 

 

 

 

웹 제작 - 로그아웃, 회원가입, 회원 리스트 목록

 

 

 

(1) 회원 가입 양식 / 회원 리스트 목록 View 제작

 

<!-- memberForm.jsp -->

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c"	uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"	uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<%	request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>회원 가입 폼</title>
</head>

<body>

<!-- 메뉴바 -->
<jsp:include page="../common/topMenu.jsp" flush="false"/>
	
<div class="container">
	<form class="form-horizontal" method="post" name="memInsForm" action="${contextPath}/member/addMember">
		<div class="form-group">
			<div class="col-sm-offset-2 col-sm-5">
				<h2 align="center">회원 가입</h2>
			</div>
		</div>
		<div class="form-group">
			<label for="id" class="col-sm-3 control-label">아이디</label>
			<div class="col-sm-2">
				<input type="text" class="form-control" id="id" name="id" maxlength="10" placeholder="아이디 입력"/>
			</div>
		</div>
		<div class="form-group">
			<label for="id" class="col-sm-3 control-label">비밀번호</label>
			<div class="col-sm-3">
				<input type="password" class="form-control" id="pw" name="pw" maxlength="20" placeholder="비밀번호 입력"/>
			</div>
		</div>
		<div class="form-group">
			<label for="id" class="col-sm-3 control-label">비밀번호 확인</label>
			<div class="col-sm-3">
				<input type="password" class="form-control" id="repwd" name="repwd" maxlength="20" placeholder="비밀번호 확인"/>
			</div>
		</div>
		<div class="form-group">
			<label for="id" class="col-sm-3 control-label">이  름</label>
			<div class="col-sm-3">
				<input type="text" class="form-control" id="name" name="name" maxlength="50" placeholder="이름 입력"/>
			</div>
		</div>
		<div class="form-group">
			<label for="id" class="col-sm-3 control-label">이메일</label>
			<div class="col-sm-5">
				<input type="text" class="form-control" id="email" name="email" maxlength="50" placeholder="이메일 입력"/>
			</div>
		</div>
		<div class="form-group">
			<label for="id" class="col-sm-3 control-label">회원가입 동의</label>
			<div class="col-sm-2">
				<label class="radio-inlne">
					<input type="radio" id="registerYn" name="registerYn" value="Y" checked> 동의&nbsp;&nbsp;
				</label>
				<label class="radio-inlne">
					<input type="radio" id="registerYn" name="registerYn" value="N"> 동의 안함
				</label>
			</div>
		</div>
		<div class="alert alert-info fade in col-sm-offset-1 col-sm-10">
			<strong>[도서쇼핑몰의 개인 정보 수집 및 이용 안내]</strong>
			<h5>
			개인 정보 제3자 제공 동의
			<br>① 개인정보를 제공받는 자: BookStore
			<br>② 개인정보를 제공받는 자의 개인 정보 이용 목적 : 영업관리, 
			설문조사 및 프로모션, 이벤트 경품 제공, eDM 발송, 행사 관련 마케팅
			<br>③ 제공하는 개인정보항목 : 이름, 이메일주소, 회사명, 직무/직책, 연락처, 휴대전화
			<br>④ 개인정보를 제공받는 자의 개인 정보 보유 및 이용 기간 :
			개인정보 취급 목적을 달성하여 더 이상 개인정보가 불 필요하게 된 경우이거나
			5년이 지나면 지체 없이 해당 정보를 파기할 것입니다.
			<br>귀하는 위와 같은 BookStore의 개인정보 수집 및 이용정책에 동의하지 
			않을 수 있으나, BookStore으로부터 솔루션, 최신 IT정보, 행사초청안내 등의 
			유용한 정보를 제공받지 못 할 수 있습니다.
			<br> 개인 정보 보호에 대한 자세한 내용은 http://www.BookStore.com 을 참조바랍니다.
			</h5>
			<div class="checkbox" align="center">
				<label>
					<input type="checkbox" id="is_subscribed" name="is_subscribed" value="o"/>
				</label> BookStore의 개인정보 수집 및 이용에 동의합니다.
			</div>
		</div>
		<div class="form-group">
			<div class="col-sm-offset-3 col-sm-4">
				<button type="reset"  class="btn btn-warning">다시 입력</button>
				<button type="submit" class="btn btn-primary">회원 가입</button>
			</div>
		</div>
	</form>
</div>
	
<!-- 푸터 -->
<jsp:include page="../common/footer.jsp" flush="false"/>

	
</body>
</html>

 

<!-- listMembers.jsp -->

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c"	uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<%	request.setCharacterEncoding("UTF-8"); %>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>회원 전체 목록</title>
</head>
<body>

<%
if(session.getAttribute("isLogOn") == null || session.getAttribute("isLogOn").equals("")) {
	response.sendRedirect("/member/loginForm");
}
/*
<c:choose>
	<c:when test="${isLogOn == true && member != null}">
		<p><b>${member.name}님, 즐거운 시간되십시오.</b></p>
		<a href="${contextPath}/member/logout.do" class="btn btn-danger">
			<span class="glyphicon glyphicon-log-out"></span>로그아웃
		</a>
	</c:when>
</c:choose>
*/
%>

<!-- 메뉴바 -->
<jsp:include page="../common/topMenu.jsp" flush="false"/>



<div class="container">
	<h1 align="center">회원 전체 목록</h1>
	<a href="${contextPath}/member/logout" class="btn btn-danger"><span class="glyphicon glyphicon-log-out">로그아웃</span></a>

	<a class="btn btn-sm btn-primary" href="${contextPath}/member/loginModalForm">로그인(Modal)</a>
	
	<table class="table table-bordered table-striped table-hover" style="width:1200px; margin:auto;">
		<tr class="info">
			<td align="center" width="80"><b>아이디</b></td>
			<td align="center" width="80"><b>비밀번호</b></td>
			<td align="center" width="80"><b>이  름</b></td>
			<td align="center" width="300"><b>이메일</b></td>
			<td align="center" width="120"><b>가입일자</b></td>
			<td align="center" width="60"><b>수정</b></td>
			<td align="center" width="60"><b>삭제</b></td>
		</tr>
	<c:forEach var="member" items="${memberLists}">	
		<tr>
			<td align="center">${member.id}</td>
			<td align="center">${member.pw}</td>
			<td align="center">${member.name}</td>
			<td align="center">${member.email}</td>
			<td align="center">${member.joinDate}</td>
			<td align="center"><a class="btn btn-sm btn-primary" href="${contextPath}/member/updateMemberForm?id=${member.id}">수정</a></td>
			<td align="center"><a class="btn btn-sm btn-danger" href="${contextPath}/member/removeMember?id=${member.id}">삭제</a></td>
		</tr>
	</c:forEach>	
	</table>
</div>

<jsp:include page="../common/footer.jsp" flush="false"/>

</body>
</html>

 

 

 

 

 

(2) topMenu View 변경

 

<!-- topMenu.jsp 뷰를 다음과 같이 변경 -->

<%@	page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@	taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<%	request.setCharacterEncoding("UTF-8"); %>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>

<script>
	const result = "${result}"
	if(result != "") {
		alert(result);
	}
</script>
<!--
	sticky-top은 상단 공간을 차지하면서 위에 고정하고,
	fixed-top은 상단 공간을 차지하지 않고 위에 고정된다.
	일부 내용이 상단 메뉴바에 가려져서 보이지 않을 수 있다.
-->
<nav class="navbar navbar-inverse navbar-sticky-top">
	<div class="container-fluid">
		<div class="navbar-header">
			<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
			</button>
			<a class="navbar-brand" href="${contextPath}/">메인으로</a>
		</div>
		<!-- 실질적인 메뉴를 나열한다. -->
		<div class="collapse navbar-collapse" id="myNavbar">
			<ul class="nav navbar-nav navbar-right">
				<li>
					<form class="navbar-form navbar-right" method="post" action="${contextPath}/member/login">
						<c:choose>
							<c:when test="${isLogOn == true && member != null }">
								<p class="navbar-text"><strong>${member.name}</strong>님 안녕하세용~</p>
								<a href="${contextPath}/member/logout" class="btn btn-warning">
									<span class="glyphicon glyphicon-log-out"></span>로그아웃
								</a>
							</c:when>
							<c:otherwise>
								<div class="form-group">
									<input type="text" class="form-control" name="id" size="12" maxlength="12" placeholder="아이디"/>
									<input type="password" class="form-control" name="pw" size="12" maxlength="12" placeholder="비밀번호"/>
								</div>
								<button type="submit" class="btn btn-primary">
									<span class="glyphicon glyphicon-log-in"></span>로그인
								</button>
							</c:otherwise>
						</c:choose>
					</form>
				</li>
				<li class="dropdown">
					<a class="dropdown-toggle" data-toggle="dropdown" href="#">기본 <span class="caret"></span></a>
					<ul class="dropdown-menu">
						<li><a href="${contextPath}/exam1/">doA</a></li>
						<li><a href="${contextPath}/exam1/doB">doB</a></li>
						<li role="presentation" class="divider"></li>
						<li><a href="${contextPath}/exam2/doC">doC</a></li>
						<li><a href="${contextPath}/exam2/gugudanForm">구구단</a></li>
						<li role="presentation" class="divider"></li>
						<li><a href="${contextPath}/exam3/doD">회원정보(객체)</a></li>
						<li><a href="${contextPath}/exam3/doE">회원정보(Map)</a></li>
						<li role="presentation" class="divider"></li>
						<li><a href="${contextPath}/member/listMembers">회원목록</a></li>
					</ul>
				</li>
				<li class="dropdown">
					<a class="dropdown-toggle" data-toggle="dropdown" href="#">회원관리 <span class="caret"></span></a>
					<ul class="dropdown-menu">
						<li><a href="${contextPath}/member/loginForm">로그인</a></li>
						<li><a href="${contextPath}/member/memberForm">회원가입</a></li>
						<li><a href="${contextPath}/member/listMembers">회원목록</a></li>
					</ul>
				</li>
			</ul>
		</div>
	</div>
</nav>

 

 

 

 

 

(3) Mapper 변경

 

<!-- Mapper (memberMapper.xml) -->

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.edu.member">
   
	<!-- 로그인정보 가져오기 -->
	<resultMap id="memberResult" type="com.edu.member.vo.MemberVO">
		<result property="id"		column="id"/>
		<result property="pw"		column="pw"/>
		<result property="name"		column="name"/>
		<result property="email"	column="email"/>
		<result property="joinDate"	column="joinDate"/>
	</resultMap>
	
	<!-- 로그인 처리 -->
	<!-- #{id} = #{MemberVO.id} -->
	<select id="loginByID" parameterType="com.edu.member.vo.MemberVO" resultMap="memberResult">
		<![CDATA[
			SELECT * FROM T_MEMBER WHERE id = #{id}
		]]>
	</select>
	
	<!-- 회원가입 처리 -->
	<insert id="addMember" parameterType="com.edu.member.vo.MemberVO">
		<![CDATA[
			INSERT INTO T_MEMBER (id, pw, name, email, joindate) 
			VALUES (#{id}, #{pw}, #{name}, #{email}, sysdate())
		]]>
	</insert>
	
	<!-- 회원 목록 조회 -->
	<select id="selectAllMemberList" resultMap="memberResult">
		<![CDATA[
			SELECT * FROM T_MEMBER ORDER BY JOINDATE DESC
		]]>
	</select>
   
</mapper>

 

 

 

 

 

(4) DAO 제작

 

// DAO Interface

package com.edu.member.dao;

import java.util.List;

import org.springframework.dao.DataAccessException;

import com.edu.member.vo.MemberVO;

//========================================================
// 회원정보 DAO
//========================================================
public interface MemberDAO {
	
	
	//========================================================
	// 로그인 처리
	//========================================================
	public MemberVO loginByID(MemberVO memberVO) throws DataAccessException;
	
	//========================================================
	// 회원가입 처리
	//========================================================
	public int addMember(MemberVO memberVO) throws DataAccessException;

	//================================================================
	// 회원 목록 조회
	//================================================================
	public List<MemberVO> selectAllMemberList() throws DataAccessException;
	
}	// End - public interface MemberDAO

 

// DAO

package com.edu.member.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Repository;

import com.edu.member.service.MemberServiceImpl;
import com.edu.member.vo.MemberVO;

//========================================================
// 회원정보 DAO
//========================================================
@Repository("memberDAO")
public class MemberDAOImpl implements MemberDAO {

	@Autowired
	private SqlSession sqlSession;
	
	private static final String Namespace = "com.edu.member";
	
	private static final Logger logger = LoggerFactory.getLogger(MemberDAOImpl.class);
	//========================================================
	// 로그인 처리
	//========================================================
	@Override
	public MemberVO loginByID(MemberVO memberVO) throws DataAccessException {
		// Namespace.loginByID = 이름, memberVO = 넘겨줄 값(id, pw)
		MemberVO memVO = sqlSession.selectOne(Namespace + ".loginByID", memberVO);
		
		return memVO;
	}
	
	//========================================================
	// 회원가입 처리
	// sqlSession.insert(사용할 mapper의 id, 저장할 값)
	//========================================================
	@Override
	public int addMember(MemberVO memberVO) throws DataAccessException {
		
		logger.info("MemberDAOImpl 회원가입 처리() 시작..." + memberVO);
		
		int result = sqlSession.insert(Namespace + ".addMember", memberVO);
		return result;
	}
	
	//================================================================
	// 회원 목록 조회
	//================================================================
	@Override
	public List<MemberVO> selectAllMemberList() throws DataAccessException {
		
		logger.info("MemberDAOImpl 회원 목록 조회() 시작...");
		
		List<MemberVO> memberLists = null;
		memberLists = sqlSession.selectList(Namespace + ".selectAllMemberList");
		
		return memberLists;
	}
	
	

}	// End - public class MemberDAOImpl implements MemberDAO

 

회원 가입 처리 시, 결과를 반환받게 했는데

Mybatis 에서 insert를 하고 나면

 

 

 

 

 

(5) Service 제작

 

package com.edu.member.service;

import java.util.List;

import org.springframework.dao.DataAccessException;

import com.edu.member.vo.MemberVO;

//===================================================
// 회원정보 서비스
//===================================================
public interface MemberService {
	
	//===================================================
	// 로그인 처리
	//===================================================
	public MemberVO login(MemberVO memberVO) throws DataAccessException;
	
	//===================================================
	// 회원가입 처리
	//===================================================
	public int addMember(MemberVO memberVO) throws DataAccessException;
	
	//================================================================
	// 회원 목록 조회
	//================================================================
	public List<MemberVO> listMembers() throws DataAccessException;

}	// End - public interface MemberService

 

// 서비스

package com.edu.member.service;


import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;

import com.edu.member.dao.MemberDAO;
import com.edu.member.vo.MemberVO;

//========================================================
// 회원정보 서비스
//========================================================
@Service("memberService")
public class MemberServiceImpl implements MemberService {

	private static final Logger logger = LoggerFactory.getLogger(MemberServiceImpl.class);
	
	@Autowired
	private MemberDAO memberDAO;
	
	//===================================================
	// 로그인 처리
	//===================================================
	@Override
	public MemberVO login(MemberVO memberVO) throws DataAccessException {
		
		logger.info("MemberServiceImpl login() 시작...");
		
		return memberDAO.loginByID(memberVO);
	}

	//===================================================
	// 회원가입 처리
	//===================================================
	@Override
	public int addMember(MemberVO memberVO) throws DataAccessException {

		logger.info("MemberServiceImpl 회원가입 처리() 시작..." + memberVO);
		return memberDAO.addMember(memberVO);
	}
	
	//================================================================
	// 회원 목록 조회
	//================================================================
	@Override
	public List<MemberVO> listMembers() throws DataAccessException {
		
		logger.info("MemberServiceImpl 회원 목록 조회() 시작...");
		List<MemberVO> memberLists = null;
		memberLists = memberDAO.selectAllMemberList();
		
		return memberLists;
	}
	
	

}

 

 

 

 

 

(6) Controller 제작

 

package com.edu.member.controller;

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

import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.edu.member.vo.MemberVO;

//=====================================================
// public interface MemberController
//=====================================================
public interface MemberController {
	
	//=====================================================
	// 로그인 처리
	//=====================================================
	public ModelAndView login(@ModelAttribute("memberVO") MemberVO member, RedirectAttributes rAttr,
			HttpServletRequest request, HttpServletResponse response) throws Exception;
	
	//=====================================================
	// 로그아웃 처리
	//=====================================================
	public ModelAndView logout(HttpServletRequest request, HttpServletResponse response) throws Exception;
	
	//=====================================================
	// 회원가입 폼
	//=====================================================
	public ModelAndView memberForm(HttpServletRequest request, HttpServletResponse response) throws Exception;
	
	//=====================================================
	// 회원가입 처리
	//=====================================================
	public ModelAndView addMember(@ModelAttribute("memberVO") MemberVO member,
			HttpServletRequest request, HttpServletResponse response) throws Exception;
	
	//=====================================================
	// 회원 전체 목록 조회
	//=====================================================
	public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception;

	
}	// End - public interface MemberController

 

// 컨트롤러

package com.edu.member.controller;

import java.util.List;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.edu.member.service.MemberService;
import com.edu.member.vo.MemberVO;

//================================================================
// 회원정보 컨트롤러
//================================================================
@Controller("memberController")
@RequestMapping(value="/member")	// url에서 /member로 시작하는 요청들을 처리하는 컨트롤러
public class MemberControllerImpl implements MemberController {
	
	private static final Logger logger = LoggerFactory.getLogger(MemberControllerImpl.class);

	//================================================================
	// @Inject : Java에서 지원하는 어노테이션... 특정 Framework에 종속적이지 않다.
	// @Autowired : Spring에서 지원하는 어노테이션... 
	//================================================================
	@Autowired
	private MemberVO memberVO;
	
	// MemberService memberService = new MemberService();
	@Autowired
	private MemberService memberService;
	
	//================================================================
	// 로그인 처리
	//================================================================
	@Override
	@RequestMapping(value="/login", method=RequestMethod.POST)
	public ModelAndView login(@ModelAttribute("memberVO") MemberVO member, RedirectAttributes rAttr, HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		logger.info("MemberControllerImpl login() 시작...");
		System.out.println("로그인 정보 => " + member.getId() + " : " + member.getPw());
		
		ModelAndView mav = new ModelAndView();
		
		// 로그인한 정보를 가지고 데이터베이스에 존재하는지 처리를 하고 그 결과를 가져온다.
		// 보여줄 화면 종류 = 데이터가 제대로 일치할때, 회원이 존재하지 않을때, 회원은 존재하는데 다른 정보가 틀렸을때
		memberVO = memberService.login(member);
		System.out.println("로그인 처리 결과 => " + memberVO);
		
		// 로그인한 정보가 데이터베이스에 존재하는지에 따라 처리를 다르게 한다.
		if(memberVO != null) {	// 로그인 정보에 해당하는 자료가 있으면
			if(member.getPw().equals(memberVO.getPw())) {
				// 아이디와 비밀번호가 일치하면 세션을 발급한다.
				HttpSession session = request.getSession();
				session.setAttribute("member", memberVO);
				session.setAttribute("isLogOn", true);
				// mav.setViewName("redirect:/member/listMembers.do");
				mav.setViewName("redirect:/");	// 메인화면으로 이동
			} else {	// 아이디는 있는데 비밀번호가 틀린 경우
				HttpSession session = request.getSession();
				String result = "비밀번호가 틀렸습니다.";
				rAttr.addFlashAttribute("result", result);
				// mav.setViewName("redirect:/member/loginForm.do");
				mav.setViewName("redirect:/");
			}
		} else {	// 로그인한 아이디가 존재하지 않으면
			// 로그인 실패 메시지를 가지고 로그인 화면으로 이동한다.
			HttpSession session = request.getSession();
			String result = "아이디가 존재하지 않습니다.";
			rAttr.addFlashAttribute("result", result);
			// mav.setViewName("redirect:/member/loginForm.do");
			mav.setViewName("redirect:/");
		}

		return mav;
	}

	//================================================================
	// 로그아웃 처리
	//================================================================
	@Override
	@RequestMapping(value= "/logout", method = RequestMethod.GET)
	public ModelAndView logout(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		HttpSession session = request.getSession();
		session.removeAttribute("member");
		session.removeAttribute("isLogOn");
		
		ModelAndView mav = new ModelAndView();
		mav.setViewName("redirect:/");	// 메인화면으로 이동
		
		System.out.println("MemberController logout 로그아웃 완료...");
		
		return mav;
	}

	//================================================================
	// 회원가입 폼
	//================================================================
	@Override
	@RequestMapping(value="/memberForm", method=RequestMethod.GET)
	public ModelAndView memberForm(HttpServletRequest request, HttpServletResponse response) throws Exception {

		ModelAndView mav = new ModelAndView();
		// mav.setViewName("/member/memberForm");	// 회원가입화면으로 이동
		
		return mav;
	}

	//================================================================
	// 회원가입 처리
	//================================================================
	@Override
	@RequestMapping(value="/addMember", method=RequestMethod.POST)
	public ModelAndView addMember(@ModelAttribute("memberVO") MemberVO memberVO, 
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		logger.info("MemberControllerImpl 회원가입 처리() 시작...");
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		
		int result = 0;
		// 사용자가 입력한 정보를 서비스에게 넘겨주어 처리하게 한다.
		result = memberService.addMember(memberVO);
		
		ModelAndView mav = new ModelAndView("redirect:/member/listMembers");
		
		
		return mav;
	}

	//================================================================
	// 회원 목록 조회
	//================================================================
	@Override
	@RequestMapping(value="/listMembers", method=RequestMethod.GET)
	public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		logger.info("MemberControllerImpl 회원 전체 목록 조회() 시작...");
		
		List<MemberVO> memberLists = memberService.listMembers();
		
		ModelAndView mav = new ModelAndView();
		mav.addObject("memberLists", memberLists);
		
		return mav;
	}
	
	
	

}	// End - public class MemberControllerImpl implements MemberController

 

Redirect 에 대한 설명은 이 단락 아래에 첨부한다~~

 

 

 

 

 


 

 

 

 

 

결과

 

 

 

회원 가입 결과

http://localhost:8080/main/member/memberForm

 

 

 

회원가입 폼 입력형식에 맞춰 내용을 입력하면 DB에 데이터가 추가된다.

 

 

 

 

 

 

로그인 후 회원 목록 클릭 시

http://localhost:8080/main/member/listMembers

 

 

 


 

 

 

 

로그 아웃 되는 지 확인

 

 

 

 

 


 

 

 

 

 

redirect / forward 

 

 

 

(1) redirect

 

쉽게 말해,

사용자가 어떤 링크를 클릭

=> 서버에서 이 링크로 가! 하고 Redirect 주소 를 다시 보내주면

=> 사용자가 그 주소로 다시 요청

 

원하는 주소 줄 테니까 사용자 니가 알아서 찾아가라

 

 

 

특징

  • request와 response 객체가 새로 생성 됨.
  • 서버는 response로 Redirect 주소를 보낸다.
  • 시스템에 변화가 생기는 경우(생성, 수정, 삭제) 재 요청을 방지를 위해 사용.
    => 연관성을 끊는다.
  • 웹 컨테이너 외부의 주소로도 이동 가능. 어차피 요청을 다시 던지니까.
  • URL이 바뀜.
  • URL을 새로 보내기 때문에 redirect시 GET 방식으로 보낸다. 
    새롭게 요청을 던지는 것이기 때문에
  • Spring에서는 RedirectAttribute를 사용하여 값을 보낼 수 있다. ( session 이용)

 

 

 

 

 

(2) forward 

 

쉽게 말해,

사용자가 링크를 클릭 (서버에 요청)

=> 서버는 자기 내부적으로( Web Container) 다른 주소로 이동한다 (forward).  객체 정보도 같이 전달
=> 이동한 곳에서 나온 결과를 사용자에게 응답

 

사용자야 , 너가 원하는 거 내가 거기가서 줄 게

 

 

 

특징

  • request와 response 객체를 유지
  • 서버가 다른 페이지를 요청하는 것이므로 request로 보냄
  • URL이 바뀌지 않는다.
  • 웹 컨테이너 내부에서만 이동 가능
  • 단순 조회에 사용한다. ( 그냥 자주 쓰지 말자.)

 

 

 

 

 


 

 

 

 

 

웹 제작 - 회원정보 수정, 삭제 기능

 

 

 

(1) 회원 정보 수정 View 제작

 

<!-- updateMemberForm.jsp -->

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c"	uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"	uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<%	request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>회원 정보 수정</title>
</head>
<body>

<!-- 메뉴바 -->
<jsp:include page="../common/topMenu.jsp" flush="false"/>
	
<div class="container">
	<form class="form-horizontal" method="post" name="memModifyForm" action="${contextPath}/member/modifyMember">
		<div class="form-group">
			<div class="col-sm-offset-2 col-sm-5">
				<h2 align="center">회원 정보 수정</h2>
			</div>
		</div>
		<div class="form-group">
			<label for="id" class="col-sm-3 control-label">아이디</label>
			<div class="col-sm-2">
				<input type="text" class="form-control" id="id" name="id" maxlength="10" value="${member.id}" readonly/>
			</div>
		</div>
		<div class="form-group">
			<label for="id" class="col-sm-3 control-label">비밀번호</label>
			<div class="col-sm-3">
				<input type="password" class="form-control" id="pw" name="pw" maxlength="20" value="${member.pw}"/>
			</div>
		</div>
		<div class="form-group">
			<label for="id" class="col-sm-3 control-label">비밀번호 확인</label>
			<div class="col-sm-3">
				<input type="password" class="form-control" id="repwd" name="repwd" maxlength="20" value="${member.pw}"/>
			</div>
		</div>
		<div class="form-group">
			<label for="id" class="col-sm-3 control-label">이  름</label>
			<div class="col-sm-3">
				<input type="text" class="form-control" id="name" name="name" maxlength="50" value="${member.name}"/>
			</div>
		</div>
		<div class="form-group">
			<label for="id" class="col-sm-3 control-label">이메일</label>
			<div class="col-sm-5">
				<input type="text" class="form-control" id="email" name="email" maxlength="50" value="${member.email}"/>
			</div>
		</div>
		<div class="form-group">
			<div class="col-sm-offset-3 col-sm-4">
				<button type="reset"  class="btn btn-warning">다시 입력</button>
				<button type="submit" class="btn btn-primary">회원 정보 수정</button>
			</div>
		</div>
	</form>
</div>
	
<!-- 푸터 -->
<jsp:include page="../common/footer.jsp" flush="false"/>
	
</body>
</html>

 

 

 

 

 

(2) Mapper 수정

 

	<!-- memberMapper.xml -->


	<!-- 아이디에 해당하는 회원 정보 가져오기 -->
	<select id="selectMember" parameterType="String" resultType="com.edu.member.vo.MemberVO">
		<![CDATA[
		SELECT * FROM t_member WHERE id = #{id}
		]]>
	</select>
	
	<!-- 아이디에 해당하는 회원 정보 수정하기 -->
	<update id="updateMember" parameterType="com.edu.member.vo.MemberVO">
		<![CDATA[
		UPDATE 	t_member
		SET		pw = #{pw}, name = #{name}, email = #{email}
		WHERE	id = #{id}
		]]>
	</update>
	
	<!-- 아이디에 해당하는 회원 정보 삭제하기 -->
	<delete id="deleteMember" parameterType="String">
		<![CDATA[
		DELETE	FROM t_member
		WHERE	id = #{id}
		]]>
	</delete>

 

 

 

 

 

(3) DAO

 

	// DAO 인터페이스
    
	//================================================================
	// 아이디에 해당하는 회원 정보 가져오기
	//================================================================
	public MemberVO selectMember(String id) throws DataAccessException;

	//================================================================
	// 아이디에 해당하는 회원 정보 수정하기
	//================================================================
	public int updateMember(MemberVO memberVO) throws DataAccessException;

	//================================================================
	// 아이디에 해당하는 회원 정보 삭제하기
	//================================================================
	public int deleteMember(String id) throws DataAccessException;

 

	// DAO

	//================================================================
	// 아이디에 해당하는 회원 정보 가져오기
	//================================================================
	@Override
	public MemberVO selectMember(String id) throws DataAccessException {
		MemberVO memberVO = sqlSession.selectOne(Namespace + ".selectMember", id);
		return memberVO;
	}

	//================================================================
	// 아이디에 해당하는 회원 정보 수정하기
	//================================================================
	@Override
	public int updateMember(MemberVO memberVO) throws DataAccessException {
		int result = sqlSession.update(Namespace + ".updateMember", memberVO);
		return result;
	}

	//================================================================
	// 아이디에 해당하는 회원 정보 삭제하기
	//================================================================
	@Override
	public int deleteMember(String id) throws DataAccessException {
		int result = sqlSession.delete(Namespace + ".deleteMember", id);
		return result;
	}

 

 

 

 

 

(4) Service

 

	// service 인터페이스

	//================================================================
	// 아이디에 해당하는 회원 정보 가져오기
	//================================================================
	public MemberVO selectMember(String id) throws DataAccessException;
	
	//================================================================
	// 아이디에 해당하는 회원 정보 수정하기
	//================================================================
	public int modifyMember(MemberVO memberVO) throws DataAccessException;
	
	//================================================================
	// 아이디에 해당하는 회원 정보 삭제하기
	//================================================================
	public int removeMember(String id) throws DataAccessException;

 

	// 서비스

	//================================================================
	// 아이디에 해당하는 회원 정보 가져오기
	//================================================================
	@Override
	public MemberVO selectMember(String id) throws DataAccessException {
		MemberVO memberVO = memberDAO.selectMember(id);
		return memberVO;
	}

	//================================================================
	// 아이디에 해당하는 회원 정보 수정하기
	//================================================================
	@Override
	public int modifyMember(MemberVO memberVO) throws DataAccessException {
		return memberDAO.updateMember(memberVO);
	}

	//================================================================
	// 아이디에 해당하는 회원 정보 삭제하기
	//================================================================
	@Override
	public int removeMember(String id) throws DataAccessException {
		return memberDAO.deleteMember(id);
	}

 

 

 

 

 

(5) Controller

 

	// Controller 인터페이스에 코드 추가

	//=====================================================
	// 아이디에 해당하는 회원 정보 조회
	//=====================================================
	public ModelAndView updateMemberForm(@RequestParam("id") String id,
			HttpServletRequest request, HttpServletResponse response) throws Exception;
	
	//=====================================================
	// 아이디에 해당하는 회원 정보 수정하기
	//=====================================================
	public ModelAndView modifyMember(@ModelAttribute("info") MemberVO memberVO,
			HttpServletRequest request, HttpServletResponse response )throws Exception;
	
	//=====================================================
	// 아이디에 해당하는 회원 정보 삭제하기
	//=====================================================
	public ModelAndView removeMember(@RequestParam("id") String id,
			HttpServletRequest request, HttpServletResponse response) throws Exception;

 

	// 컨트롤러

	//=====================================================
	// 아이디에 해당하는 회원 정보 조회
	//=====================================================
	@Override
	@RequestMapping(value="/updateMemberForm", method=RequestMethod.GET)
	public ModelAndView updateMemberForm(@RequestParam("id") String id, HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		System.out.println("MemberController 회원 정보 조회 id ==> " + id);
		
		// 회원 전체 리스트 화면에서 수정을 요청한 id에 해당하는 정보를 찾는 일을 서비스에게 부탁한다.
		memberVO = memberService.selectMember(id);
		System.out.println("MemberController 회원 정보 조회 ==> " + memberVO);
		
		// 찾아온 데이터를 가지고 개인 정보 수정화면으로 넘어간다.
		ModelAndView mav = new ModelAndView("/member/updateMemberForm");
		mav.addObject("member", memberVO);
		
		return mav;
	}
	
	//=====================================================
	// 아이디에 해당하는 회원 정보 수정하기
	//=====================================================
	@Override
	@RequestMapping(value="modifyMember", method=RequestMethod.POST)
	public ModelAndView modifyMember(@ModelAttribute("memberVO") MemberVO memberVO, HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		System.out.println("MemberController 회원 정보 수정하기 memberVO ==> " + memberVO);
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		
		int result = memberService.modifyMember(memberVO);

		ModelAndView mav = new ModelAndView("redirect:/member/listMembers");
		return mav;
	}
	
	//=====================================================
	// 아이디에 해당하는 회원 정보 삭제하기
	//=====================================================
	@Override
	@RequestMapping(value="removeMember", method=RequestMethod.GET)
	public ModelAndView removeMember(@RequestParam("id") String id, HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		request.setCharacterEncoding("UTF-8");
		int result = memberService.removeMember(id);
		
		ModelAndView mav = new ModelAndView("redirect:/member/listMembers");
		return mav;
	}

 

 

 

 

 


 

 

 

 

 

결과

 

 

 

 

수정을 하나 삭제하나 모두 listMembers로 이동되게 Controller에서 설정 되어있는 대로 실행 된다.

728x90
반응형

댓글