관리 메뉴

DeseoDeSeo

[Spring] 회원 가입 기능 마무리 및 로그인 기능 본문

spring

[Spring] 회원 가입 기능 마무리 및 로그인 기능

deseodeseo 2023. 9. 18. 23:56

MySQL.sal연결 하려면 console 옆의 Data Source Explorer > Database connections > com > 파란 원통 모양의 com 클릭

Membercontroller.java

○ 회원가입 시, 프로필은 일단 빈칸으로 넣어둔다.

○  새로 배운 것: 유효성 검사!

@RequestMapping("/join.do")
	public String join(Member m, RedirectAttributes rttr, HttpSession session) {
		System.out.println("회원가입 기능요청");
		
		//유효성 검사
		if(m.getMemID() ==null || m.getMemID().equals("")|| m.getMemPassword()==null || m.getMemPassword().equals("")||
				m.getMemName()==null || m.getMemName().equals("")|| m.getMemAge() ==0 || m.getMemEmail() == null ||
				m.getMemEmail().equals("")) {
			//회원 가입을 할 수 없다 하나라도 누락되어 있기 때문에
			
			//실패시 joinForm.do로 msgType과 msg내용을 보내야함.
			rttr.addFlashAttribute("msgType", "실패메세지");
			rttr.addFlashAttribute("msg", "모든 내용을 입력하세요.");
			return "redirect:/joinForm.do";
			//redirect방식에서는 model에 데이터 저장 불가.
			//forward방식에서만 model에 데이터저장 가능.
			//RedirectAttributes - 리다이렉트 방식으로 이동할 때 보낼 데이터를 저장하는 객체 
		}else {
			//회원 가입 가능

			//null값 대신 넣으려구.
			m.setMemProfile("");
			int cnt = mapper.join(m);
			//회원가입 후 index.jsp로 이동시키시오.
			if(cnt==1) {
				System.out.println("회원가입 성공");
				rttr.addFlashAttribute("msgType", "성공메세지");
				rttr.addFlashAttribute("msg", "회원가입에 성공했습니다.");
				//회원가입 성공 시 로그인 처리까지 시키기
				session.setAttribute("mvo", m);
				//mvo라는 이름으로 m을 넣겠다.
				//성공시 main으로 이동함,
				return "redirect:/";
			}else {
				System.out.println("회원가입 실패.");
				rttr.addFlashAttribute("msgType", "실패메세지");
				rttr.addFlashAttribute("msg", "회원가입에 실패했습니다.");
				return "redirect:/joinForm.do" ;
			}
			
		}
			
		}
	@RequestMapping("/logout.do")
	public String logout(HttpSession session) {
		//session을 사용하고 싶으면 매개변수에 적으면 된다.
		session.invalidate();
		//로그아웃 기능
		return "redirect:/";
	}
	
	@RequestMapping("/loginForm.do")
	public String loginForm() {
		
		return "member/loginForm";
	}
	
	@RequestMapping("/Login.do")
	public String login(RedirectAttributes rttr,  Member m, HttpSession session) {
		//문제
		// mapper에 login이라는 메소드 이름으로 로그인 기능을 수행하시오.
		// 로그인 성공 시 -> index.jsp 이동 후, 로그인에 성공했습니다 modal창 띄우기
		// 로그인 실패 시 -> login.jsp 이동 후, 로그인에 실패했습니다 modal 창 띄우기
		Member mvo =mapper.login(m);
		//mvo는 실패하면 null이 들어감.
		//mvo가 실패하지 않는다면 
		if(mvo != null ) {
			
			rttr.addFlashAttribute("msgType", "성공메세지");
			rttr.addFlashAttribute("msg", "로그인에 성공했습니다.");
			session.setAttribute("mvo", mvo);
			return "redirect:/";
		}else {
			rttr.addFlashAttribute("msgType", "실패메세지");
			rttr.addFlashAttribute("msg", "로그인에 실패했습니다.");
			return "redirect:/loginForm.do";
		}
		
	}

 

joinForm.jsp
 <!-- Modal, 회원 가입 실패시 출력 됨. -->
  <div class="modal fade" id="myMessage" role="dialog">
    <div class="modal-dialog">
    
      <!-- Modal content-->
      <div id="messageType" class="modal-content">
        <div class="modal-header panel-heading">
          <button type="button" class="close" data-dismiss="modal">&times;</button>
          <h4 class="modal-title">${msgType}</h4>
        </div>
        <div class="modal-body">
          <p id="">${msg}</p>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        </div>
      </div>
      
    </div>
  </div>
  
	
	
	
	<script type="text/javascript">
		function registerCheck(){
			var memID = $("#memID").val();
			$.ajax({
				url:"${contextPath}/registerCheck.do",
				type:"get",
				data:{"memID":memID},
				success:function(data){
					// 중복여부 확인( data:1 -> 사용 가능, data:0 -> 사용 불가능)
					if(data==1){
						$("#checkMessage").text("사용할 수 있는 아이디 입니다.");
						$("#checkType").attr("class","modal-content panel-success");
						
					}else{
						$("#checkMessage").text("사용할 수 없는 아이디 입니다.");
						$("#checkType").attr("class","modal-content panel-warning");
					}
					$("#myModal").modal("show");
					
				},
				error: function(){
					alert("error");
				}
			});
		}
		
		function passwordCheck(){
			var memPassword1 = $("#memPassword1").val();
			var memPassword2 = $("#memPassword2").val();
			
			if(memPassword1 != memPassword2){
				$("#passMessage").html("비밀번호가 서로 일치하지 않습니다.");
			} else{
				/* pw1과 pw2의 값이 같을 때만 pw가 넘어감. */
				$("#memPassword").val(memPassword1);
				$("#passMessage").html(" ");
			}
			
		}
		//html을 다 로딩할때 까지 기다리겠다.
		$(document).ready(function(){
			if(${not empty msgType}){
				if(${msgType eq "실패메세지"}){
					$("#messageType").attr("class","modal-content panel-warning");
				}
				$("#myMessage").modal("show");
			}
		});
		
		
	</script>
MemberMapper.java
package kr.spring.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import kr.spring.entity.Board;
import kr.spring.entity.Member;

@Mapper // MyBatis가 interFace를 찾기 위해 달아주는 부분.
public interface MemberMapper {
	//sql session factory가 이걸 이용해서 사용함.
	public Member registerCheck(String memID);

	public int join(Member m);

	public int login(String memID, String memPassword);


	public Member login(Member m);
	

}
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="kr.spring.mapper.MemberMapper">
<!-- membermapper.java가 찾아오려면 namespace이름이랑 같아야한다. -->
	
	<select id="registerCheck" parameterType="String" resultType="kr.spring.entity.Member">
			SELECT * FROM MEMBER WHERE MEMID = #{memID}
	</select>
	<insert id ="join" parameterType="kr.spring.entity.Member">
		INSERT INTO MEMBER(MEMID, MEMPASSWORD,MEMNAME,MEMAGE,MEMGENDER,MEMEMAIL,MEMPROFILE) VALUES(#{memID},#{memPassword},#{memName},#{memAge},#{memGender},#{memEmail},#{memProfile})
	</insert>
	
	<select id ="login" parameterType ="kr.spring.entity.Member" resultType="kr.spring.entity.Member" >
		SElECT * FROM MEMBER WHERE MEMID=#{memID} AND MEMPASSWORD =#{memPassword}
	</select>
	
	
	
	
	
</mapper>
header.jsp
      <!-- mvo가 비어있을 때만  보여줌.-->
      <c:if test="${empty mvo}">
      <ul class="nav navbar-nav navbar-right">
      <li class="dropdown">
      	    <a class ="dropdown-toggle" data-toggle="dropdown" href="#">접속하기 <span class="caret"></span></a>
      		<ul class="dropdown-menu">
        		<li><a href="${contextPath}/loginForm.do"> 로그인 </a></li>
       			<li><a href="${contextPath}/joinForm.do"> 회원가입 </a></li>
        	</ul>
        </li>
      </ul>
      </c:if>
      
       <c:if test="${not empty mvo}">
      <ul class="nav navbar-nav navbar-right">
      <li class="dropdown">
      	    <a class ="dropdown-toggle" data-toggle="dropdown" href="#">접속하기 <span class="caret"></span></a>
      		<ul class="dropdown-menu">
        		<li><a href="#"> 회원정보수정 </a></li>
        		<li><a href="#"> 프로필 사진 등록 </a></li>
        		<li><a href="${contextPath}/logout.do"> 로그아웃 </a></li>
       			
        	</ul>
        </li>
      </ul>
      </c:if>
index.jsp
<!-- Modal, 회원 가입 실패시 출력 됨. -->
  <div class="modal fade" id="myMessage" role="dialog">
    <div class="modal-dialog">
    
      <!-- Modal content-->
      <div id="messageType" class="modal-content">
        <div class="modal-header panel-heading">
          <button type="button" class="close" data-dismiss="modal">&times;</button>
          <h4 class="modal-title">${msgType}</h4>
        </div>
        <div class="modal-body">
          <p id="">${msg}</p>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        </div>
      </div>
      
    </div>
  </div>
  
  <script type="text/javascript">
  	$(document).ready(function(){
  		if(${not empty msgType}){
			if(${msgType eq "성공메세지"}){
				$("#messageType").attr("class","modal-content panel-warning");
			}
			$("#myMessage").modal("show");
		}
  	});
  </script>
  

</body>
loginForm.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 ="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="contextPath" value ="${pageContext.request.contextPath}" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<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.6.4/jquery.min.js"></script>
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
	<div class="container">
		<jsp:include page="../common/header.jsp"></jsp:include>
		<h2>Spring MVC03</h2>
		<div class="panel panel-default">
			<div class="panel-heading">Board</div>
			<div class="panel-body">
				<form action="${contextPath}/Login.do" method="post">
				
					<table style ="text-align:center; border: 1px solid #dddddd " class="table table-borded">
						<tr>
						 	<td style="width:110px; vertical-align:middle;">아이디</td>
						 	<td><input type="text" name ="memID" id="memID" class="form-control" maxlength="20" placeholder="아이디를 입력하세요."></td>
							
						
						</tr>
						<tr>
						 	<td style="width:110px; vertical-align:middle;">비밀번호</td>
						 	<td><input type="password" name ="memPassword" id="memPassword" class="form-control" maxlength="20" placeholder="비밀번호를 입력하세요."></td>
						</tr>
						
						<tr>
							<td colspan ="2">
							<span id="passMessage" style="color:red;"></span>
								<input type="submit" class="btn btn-primary btn-sm pull-right" value="로그인">
								<input type="reset" class="btn btn-warning btn-sm pull-right" value="취소">
							
							</td>
						</tr>
						
					</table>
				</form>
			</div>
			
			<div class="panel-footer">스프링게시판-뇽뇽이</div>
		</div>
	</div>
	
	 <!-- Modal, 아이디 중복체크용 모달 -->
  <div class="modal fade" id="myModal" role="dialog">
    <div class="modal-dialog">
    
      <!-- Modal content-->
      <div id="checkType" class="modal-content">
        <div class="modal-header panel-heading">
          <button type="button" class="close" data-dismiss="modal">&times;</button>
          <h4 class="modal-title"> 메세지 확인 </h4>
        </div>
        <div class="modal-body">
          <p id="checkMessage"> </p>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        </div>
      </div>
      
    </div>
  </div>
  
  <!-- Modal, 회원 가입 실패시 출력 됨. -->
  <div class="modal fade" id="myMessage" role="dialog">
    <div class="modal-dialog">
    
      <!-- Modal content-->
      <div id="messageType" class="modal-content">
        <div class="modal-header panel-heading">
          <button type="button" class="close" data-dismiss="modal">&times;</button>
          <h4 class="modal-title">${msgType}</h4>
        </div>
        <div class="modal-body">
          <p id="">${msg}</p>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        </div>
      </div>
      
    </div>
  </div>
  
	
	
	
	<script type="text/javascript">
		
		//html을 다 로딩할때 까지 기다리겠다.
		$(document).ready(function(){
			if(${not empty msgType}){
				if(${msgType eq "실패메세지"}){
					$("#messageType").attr("class","modal-content panel-warning");
				}
				$("#myMessage").modal("show");
			}
		});
		
		
	</script>

</body>
</html>

➤ RedirectAttributes?

    : 리디렉션을 수행할 때 한 컨트롤러 메서드에서 다른 컨트롤러 메서드로 Attributes를 전달하는데 이용되는 스프링 프레임워크의 인터페이스이다.