2024년 4월 21일

로그인

login.jsp

<div class="cont">
				<form id="formLogin" method="post" action="login_process.do">

					<!-- <input type="hidden" id="mode" name="mode" value="login"/>
					<input type="hidden" id="returnUrl" name="returnUrl" value="https%3A%2F%2Fwww.pocketsalad.co.kr%3A443"/> -->
					<div class="member_login_box">
						<div class="login_input_sec">
							<div>
								<input type="text" id="id" name="id" value="" placeholder="아이디" required="true"><!--id  -->
								<input type="password" id="pass" name="pass" value="" placeholder="비밀번호" required="true"><!-- pass  -->
							</div>
							<button type="submit" class="btn_login_nbtn" id="loginBtn">로그인</button>
							<button id="btnJoinMember" class="btn_member_join">회원가입</button>
							
						</div>

						<div class="login_under_con" >
							<ul class="idpw_list">
								<li><button id="btnFindId" class="btn_member_white">아이디 찾기</button></li>
								<li><button id="btnFindPwd" class="btn_member_white">비밀번호 찾기</button></li>
							</ul>
						</div>
					</div>
				</form>
</div>

<script type="text/javascript">
	var $formLogin;
	$(document).ready(function () {
	    var order_no_max_length = $('input[name=orderNo]').data('max-length');
		$('#btnJoinMember').click(function (e) { //회원가입
			e.preventDefault();
			location.href = 'join.do';
		});
		$('#btnFindId').click(function (e) { //아이디찾기
			e.preventDefault();
			location.href = 'find_id.do';
		});
		$('#btnFindPwd').click(function (e) { //비밀번호 찾기
			e.preventDefault();
			location.href = 'find_pass.do';
		});

		$('#id, #pass').focusin(function () {
			$('.js_caution_msg1', '#formLogin').addClass('dn');
		});
		
		$.validator.addMethod(
				"spaceCheck", //validate명
				function (value, element) {
			//검사하는 name태그의 value 중 공백이 없으면 true, 있으면 false리턴
			//false 리턴 시 messages에 선언된 내용들 띄워줌
					return $(element).val().indexOf(" ")=-1?true:false;
				  	}
			);

		$formLogin = $('#formLogin');
		$formLogin.validate({
			dialog: false,
			rules: {
				id: {
					required: true
				},
				pass: {
					required: true
				}
			},
			messages: {
				id: {
					required: "아이디를 입력해주세요"
				},
				pass: {
					required: "패스워드를 입력해주세요"
				}
			}, submitHandler: function (form) {
			    /* if (window.location.search) {
                    var _tempUrl = window.location.search.substring(1);
                    var _tempVal = _tempUrl.split('=');

                    if (_tempVal[1] == 'lnCouponDown') {
                        $('#returnUrl').val(document.referrer);
                    }
                }
				form.target = 'ifrmProcess'; */
				form.submit();
			}
		});

		$("#apple_btn").on("click", startClicked);
		function startClicked(){
			$("#appleid-signin").click();
		}
	});
</script>

회원가입

join.jsp

<script type="text/javascript">

//본 예제에서는 도로명 주소 표기 방식에 대한 법령에 따라, 내려오는 데이터를 조합하여 올바른 주소를 구성하는 방법을 설명합니다.
function execDaumPostcode() {
	new daum.Postcode({
		oncomplete : function(data) {
			// 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.

			// 도로명 주소의 노출 규칙에 따라 주소를 표시한다.
			// 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
			var roadAddr = data.roadAddress; // 도로명 주소 변수
			var extraRoadAddr = ''; // 참고 항목 변수

			// 법정동명이 있을 경우 추가한다. (법정리는 제외)
			// 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
			if (data.bname !== '' && /[동|로|가]$/g.test(data.bname)) {
				extraRoadAddr += data.bname;
			}
			// 건물명이 있고, 공동주택일 경우 추가한다.
			if (data.buildingName !== '' && data.apartment === 'Y') {
				extraRoadAddr += (extraRoadAddr !== '' ? ', '
						+ data.buildingName : data.buildingName);
			}
			// 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
			if (extraRoadAddr !== '') {
				extraRoadAddr = ' (' + extraRoadAddr + ')';
			}
		

			// 우편번호와 주소 정보를 해당 필드에 넣는다.
			document.getElementById('zipcode').value = data.zonecode;
			document.getElementById("addr").value = roadAddr;
		}
	}).open();
}

    $(function(){
    	
    	$("#allMenuToggle").click(function(){
    		$("#gnbAllMenu").toggle();
    	});//click
    	
    	$("#joinBtn").click(function(){
    		joinCheck();
    		
    	});//click
    	
    	
    	
    	//아이디 중복검사
    	$("#id").on("propertychange change keyup paste input", function(){
    		var memberId=$("#id").val();
    		var data={memberId : memberId}
    		var idReg = /^[a-z]+[a-z0-9]{5,19}$/g;
    		
    		$.ajax({
    			type:"post",
    			url:"id_chk_process.do",
    			data : data,
    			success: function(result){
    				if(result != 'fail' ){ 
    					$("#errorId").text("");
    					$("#possId").css("display","inline-block");
    					$("#impossId").css("display","none");
    					$("#idPassFlag").val("0"); //사용가능
    				}else{
    					$("#errorId").text("");
    					$("#impossId").css("display","inline-block");
    					$("#possId").css("display","none");
    					$("#idPassFlag").val("1"); //아이디사용불가능
    				}
    				
    				if(!idReg.test( $("input[name=id]").val() )){
    					$("#errorId").text("아이디는 영문자로 시작하는 6~20자 영문자 또는 숫자이어야 합니다.");
    					$("#possId").css("display","none");
    					$("#impossId").css("display","none");
    					$("#idPassFlag").val("1"); //사용불가능
    				}
    			}
    		});
    		
    		
    	});
    	
    	//비밀번호 일치확인
    	$("#pass, #pass_chk").on("propertychange change keyup paste input", function(){
    		var pw = document.getElementById('pass').value;
            var SC = ["!","@","#","$","%"];
            var check_SC = 0;
 			
            
            for(var i=0;i<SC.length;i++){
                if(pw.indexOf(SC[i]) != -1){
                    check_SC = 1;
                }
            }
            if(pw.length < 6 || pw.length>16 || check_SC == 0){
            	$("#errorPass").text('!,@,#,$,% 의 특수문자포함 6~15글자이내로 입력.')
            	$("#passPassFlag").val("1"); //사용불가능
            }else{
            	$("#errorPass").text("");
            	$("#passPassFlag").val("0"); //사용가능
            }
            
            if(document.getElementById('pass').value !="" && document.getElementById('pass_chk').value!=""){
                if(document.getElementById('pass').value==document.getElementById('pass_chk').value){
                	$("#truePass").css("display","inline-block");
					$("#falsePass").css("display","none");
					$("#psChkPassFlag").val("0"); //사용가능
                }
                else{
                	$("#falsePass").css("display","inline-block");
					$("#truePass").css("display","none");
					$("#psChkPassFlag").val("1"); //사용불가능
                }
            }
    	});
    	
    });//ready
    
    //비어있는값 계산
    function joinCheck(){
    	//psChkPassFlag passPassFlag idPassFlag
    	var userid=$("#id").val();
    	var userpass=$("#pass").val();
    	var username=$("#name").val();
    	var userphone=$("#phone").val();
    	var useremailH=$("#email_head").val();
    	var useremailN=$("#email_next").val();
    	var userzipcode=$("#zipcode").val();
    	var userdeaddr=$("#deAddr").val();
    	var idPassFlag=$("#idPassFlag").val();
    	var passPassFlag=$("#passPassFlag").val();
    	var psChkPassFlag=$("#psChkPassFlag").val();
    	
    	if(idPassFlag=='1'){
    		$("#id").focus();
    		return;
    	}
    	
    	if(passPassFlag=='1'){
    		$("#pass").focus();
    		return;
    	}
    	
    	if(psChkPassFlag=='1'){
    		$("#pass_chk").focus();
    		return;
    	}
    	
    	if(userid.length==0){
    		$("#errorId").text("아이디를 입력하세요");
    		$("#id").focus();
    		return;
    	}else{
    		$("#errorId").text("");
    	}
    	
    	if(userpass.length==0){
    		$("#errorPass").text("비밀번호를 입력하세요");
    		$("#pass").focus();
    		return;
    	}else{
    		$("#errorPass").text("");
    	}
    	
    	if(username.length==0){
    		$("#errorName").text("이름을 입력하세요");
    		$("#name").focus();
    		return;
    	}else{
    		$("#errorName").text("");
    	}
    	
    	if(useremailH.length==0){
    		$("#errorEmail").text("이메일을 입력하세요");
    		$("#email_head").focus();
    		return;
    	}else{
    		$("#errorEmail").text("");
    	}
    	
    	if(useremailN.length==0){
    		$("#errorEmail").text("이메일주소를 입력하세요");
    		$("#email_next").focus();
    		return;
    	}else{
    		$("#errorEmail").text("");
    	}
    	
    	if(userphone.length==0){
    		$("#errorPhone").text("전화번호를 입력하세요");
    		$("#phone").focus();
    		return;
    	}else{
    		$("#errorPhone").text("");
    	}
    	
    	if(userzipcode.length==0){
    		$("#errorZipcode").text("우편번호를 입력하세요");
    		$("#zipcode").focus();
    		return;
    	}else{
    		$("#errorZipcode").text("");
    	}
    	
    	if(userdeaddr.length==0){
    		$("#errorDeaddr").text("상세주소를 입력하세요");
    		$("#deAddr").focus();
    		return;
    	}else{
    		$("#errorDeaddr").text("");
    	}
    	
    	var pass = true;
        /*
         * 필수 동의 항목 검증
         */
        $(':checkbox.require').each(function (idx, item) {
            var $item = $(item);
            if (!$item.prop('checked')) {
                pass = false;
                alert("필수항목에 체크해주세요!")
                _.delay(function () {
                    $item.focus();
                }, 1000);        
                return false;
            }
        });
        
    	if(pass){
    		$("#formJoin").submit();
    	}
    			
    	
    }
    
    
</script>

<div class="content_box">
	<div class="join_base_wrap">
		<div class="member_tit">
			<h2>회원가입</h2>
			<ol>
				<li class="page_on"><span>01</span> 정보입력<span><img src="<http://salad.sist.co.kr/resources/images/main/icon_join_step_on.png>" alt=""></span></li>
				<li><span>02</span> 가입완료</li>
			</ol>
		</div>
		<!-- //member_tit -->
		<div class="member_cont">
			<form id="formJoin" name="formJoin" action="join_process.do" method="post">
				<input type="hidden" name="rncheck" value="">
				<input type="hidden" name="dupeinfo" value="">
				<input type="hidden" name="pakey" value="">
				<input type="hidden" name="foreigner" value="">
				<input type="hidden" name="adultFl" value="">
				<input type="hidden" name="mode" value="join">

				<!-- 회원가입/정보 기본정보 --><div class="base_info_box">
    
	  <h3>기본정보</h3>
 

    <span class="important">표시는 반드시 입력하셔야 하는 항목입니다.</span>

    <div class="base_info_sec">
        <table border="0" cellpadding="0" cellspacing="0">
		
		<colgroup>
                <col width="25%">
                <col width="75%">
            </colgroup>

            <tbody>
            <tr>
                <th><span class="important">아이디</span></th>
                <td>
                    <div class="member_warning">
                        <input type="text" id="id" name="id" data-pattern="gdMemberId">
                        <input type="hidden" id="idPassFlag" name="idPassFlag" value="0">
                    </div>
                    <span id="errorId" style="color: red; "></span>
                    <span id="possId" style="color: green; display: none;">사용 가능한 아이디입니다.</span>
                    <span id="impossId" style="color: red; display: none;">아이디가 이미 존재합니다.</span>
                </td>

            </tr>
            <tr class="">
                <th><span class="important">비밀번호</span></th>
                <td class="member_password">
                    <div class="member_warning">
                        <input type="password" id="pass" name="pass" autocomplete="off" placeholder="" onchange="check_pw()">
                        <input type="hidden" id="passPassFlag" name="passPassFlag" value="1">
                    </div>
                    <span id="errorPass"  style="color: red"></span>
                </td>       
            </tr>
            <tr class="">
                <th><span class="important">비밀번호 확인</span></th>
                <td>
                    <div class="member_warning">
                        <input type="password" class="check-id"  id="pass_chk" name="pass_chk" autocomplete="off" onchange="check_pw()">
                    	<input type="hidden" id="psChkPassFlag" name="psChkPassFlag" value="1">
                    </div>
                    <span id="truePass" style="color: green; display: none;">비밀번호가 일치합니다.</span>
                    <span id="falsePass" style="color: red; display: none;">비밀번호가 일치하지않습니다.</span>
                </td>
            </tr>
            <tr>
                <th><span class="important">이름</span></th>
                <td>
                    <div class="member_warning">
                        <input type="text" name="name"   id="name" data-pattern="gdMemberNmGlobal" value="" maxlength="30" >
                    </div>
                    <span id="errorName"  style="color: red"></span>
                </td>
            </tr>
            <tr>
                <th><span class="important">이메일</span></th>
                <td class="member_email">
                    <div class="member_warning">
						<input type="hidden" name="email" id="email">
                        <input type="text" name="email_head" id="email_head" value="" style="width:160px;margin-right:7px;">@
						<input type="text" name="email_next" id="email_next" value="" style="width: 181px;">
                        <select id="emailDomain" name="emailDomain" class="chosen-select" style="width:180px;">
                            <option value="self">직접입력</option>
                            <option value="naver.com">naver.com</option>
                            <option value="hanmail.net">hanmail.net</option>
                            <option value="daum.net">daum.net</option>
                            <option value="nate.com">nate.com</option>
                            <option value="hotmail.com">hotmail.com</option>
                            <option value="gmail.com">gmail.com</option>
                            <option value="icloud.com">icloud.com</option>
                        </select>
                    </div>
										<span id="errorEmail"  style="color: red"></span>
                </td>
            </tr>
            <tr>
                <th><span class="important">휴대폰번호</span></th>
                <td class="member_address">
                    <div class="address_postcode">
                        <input type="text" id="phone" name="phone" maxlength="11" placeholder="- 없이 입력하세요." 
                        data-pattern="gdNum" value=""  oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\\..*)\\./g, '$1');"  style="width: calc( 100% - 187px) ;">
                    </div>
                    <span id="errorPhone"  style="color: red"></span>
                </td>
            </tr>
            <!-- 우편번호 -->
            <tr >
            <th><span class="important">우편번호</span></th>
            <td class="member_address">
            <div class="address_postcode">
            <input type="text" name="zipcode" id="zipcode" value="" style="width:160px;margin-right:7px;"/>
            <button class="btn_post_search"  type="button" id="zipcodeBtn" style="width:165px;" onclick="execDaumPostcode()">우편번호</button>
            </div>
            <span id="errorZipcode"  style="color: red"></span>
            </td>
            
            </tr>
            <!-- 주소 -->
            <tr>
            <th><span class="important">주소</span></th>
            <td>
                    <div class="member_warning">
                        <input type="text" id="addr" name="addr" data-pattern="gdMemberId">
                    </div>
             </td>
            </tr>
            <!-- 상세주소 -->
            <tr>
            <th><span class="important">상세주소</span></th>
            <td>
                    <div class="member_warning">
                        <input type="text" id="deAddr" name="deAddr" data-pattern="gdMemberId">
                    </div>
                    <span id="errorDeaddr"  style="color: red"></span>
             </td>
            </tr>
            </tbody>
        </table>
    </div>
    <!-- //base_info_sec -->
</div>

MemberController.java

package kr.co.salad.user.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.encoding.PasswordEncoder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

import kr.co.salad.user.domain.KategoriePrdDomain;
import kr.co.salad.user.service.KategoriePrdService;
import kr.co.salad.user.service.MemberService;
import kr.co.salad.user.vo.MemberVO;

import static org.springframework.web.bind.annotation.RequestMethod.GET;
import static org.springframework.web.bind.annotation.RequestMethod.POST;

import java.lang.reflect.Member;
import java.util.List;;

@SessionAttributes({"userId","userName"})
@Controller
public class MemberController {
	
	@Autowired(required = false)
	private MemberService ms;
	
	@Autowired(required = false)
	private KategoriePrdService kpService;

	
	//로그인이동
	@RequestMapping(value = "/login.do",method = GET)
	public String login(Model model) {
		

		List<KategoriePrdDomain> mainCateList=kpService.mainCateList();
		model.addAttribute("mainCateList",mainCateList);
		
		return "user/member/login";
	}
	
	//로그인시도
	@RequestMapping(value = "/login_process.do",method = {GET,POST})
	public String loginProcess(MemberVO mVO,Model model) {
		String loginUri="";
		String loginname=ms.searchLogin(mVO);
		System.out.println("로그인한 이름 : "+loginname);
		if(loginname==""||loginname==null) { //로그인 실패
			System.out.println("실패");
			model.addAttribute("eMsg","일치하는 회원이 없습니다.");
			loginUri="user/member/login";
		}else { //로그인 성공
			System.out.println("로그인한 ID : "+mVO.getId());
			model.addAttribute("userId",mVO.getId()); //id세션설정
			model.addAttribute("userName",loginname); //name세션설정
			loginUri="redirect:<http://salad.sist.co.kr/index.do>";
			
		}
		
		System.out.println(loginUri);
		return loginUri;
	}
	
	//회원가입이동
	@RequestMapping(value = "/join.do",method = GET)
	public String join(Model model) {
		
		List<KategoriePrdDomain> mainCateList=kpService.mainCateList();
		model.addAttribute("mainCateList",mainCateList);
		return "user/member/join";
	}
	
	//회원가입성공
	@RequestMapping(value = "/join_process.do",method = POST)
	public String joinProcess(MemberVO mVO,Model model) {
		BCryptPasswordEncoder passEncoder=new BCryptPasswordEncoder();
		
		String loginUri="";
		
		
		mVO.setPass(passEncoder.encode(mVO.getPass()));
		System.out.println(mVO);
		boolean joinFalg=ms.addJoin(mVO);
		if(joinFalg) {
			model.addAttribute("name",mVO.getName());
			loginUri="user/member/join_ok";
		}else {
			model.addAttribute("joinFail","회원가입에 실패하였습니다.");
			loginUri="user/member/join";
		}

		return loginUri;
	}
	
	//ID찾기이동
	@RequestMapping(value = "/find_id.do",method = GET)
	public String findId(Model model) {
		

		List<KategoriePrdDomain> mainCateList=kpService.mainCateList();
		model.addAttribute("mainCateList",mainCateList);
		return "user/member/find_id";
	}
	
	//ID찾기완료이동
	@RequestMapping(value = "/find_id_process.do",method = POST)
	public String findIdProcess(MemberVO mVO,Model model) {
		String findIdUri="";
		
		String findId=ms.searchFindIdChk(mVO);
		System.out.println(findId);

		List<KategoriePrdDomain> mainCateList=kpService.mainCateList();
		model.addAttribute("mainCateList",mainCateList);

		if(findId!=null) {
			model.addAttribute("id",findId);
			model.addAttribute("name",mVO.getName());
			findIdUri="user/member/find_id_success";
		}else{
			model.addAttribute("eMsg",true);
			findIdUri="user/member/find_id";
		}

		return findIdUri;
	}
	
	//ID중복확인
	@RequestMapping(value = "/id_chk_process.do",method = POST)
	@ResponseBody
	public String idChkProcess(String memberId){
		int result=ms.searchIdChk(memberId);
		System.out.println(result);
		if(result!=0) { //중복 아이디 존재
			return "fail";
		}else {
			return "success"; //아이디 사용 가능
		}
	}
		
	//PW찾기이동
	@RequestMapping(value = "/find_pass.do",method = GET)
	public String findPass(Model model) {

		List<KategoriePrdDomain> mainCateList=kpService.mainCateList();
		model.addAttribute("mainCateList",mainCateList);

		return "user/member/find_password";
	}
	
	//PW입력페이지이동(회원확인)
	@RequestMapping(value = "/find_pass_reset.do",method = POST)
	public String findPassReset(MemberVO mVO,Model model) {
		
		String findpwUri="";
		
		System.out.println("비밀번호 변경전 회원 확인 : "+mVO);
		boolean pwChk=ms.searchFindPassChk(mVO);

		List<KategoriePrdDomain> mainCateList=kpService.mainCateList();
		model.addAttribute("mainCateList",mainCateList);

		if(pwChk) { //회원정보있음
			model.addAttribute("id",mVO.getId());
			findpwUri="user/member/find_password_reset";
		}else { //회원정보없음
			model.addAttribute("pwFindFail","일치하는 회원이 없습니다.");
			findpwUri="user/member/find_password";
		}
		
		return findpwUri;

	}
	
	//PW변경
	@RequestMapping(value = "/find_pass_process.do",method = POST)
	public String findPassProcess(MemberVO mVO,Model model) {
		BCryptPasswordEncoder passEncoder=new BCryptPasswordEncoder();
		String updatePwUri="";
		
		mVO.setNewPass(passEncoder.encode(mVO.getNewPass())); //새로운 비밀번호 암호화
		System.out.println("비밀번호 변경 : "+mVO);
		int pwEdit=ms.editPassReser(mVO);
		if(pwEdit==1) { //비밀번호 변경 성공
			List<KategoriePrdDomain> mainCateList=kpService.mainCateList();
			model.addAttribute("mainCateList",mainCateList);
			System.out.println("비번 변경 성공");
			updatePwUri="user/member/find_password_complete";
		}else { //비밀번호 변경 실패
			System.out.println("비번 변경 실패");
			model.addAttribute("pwEditFail","비밀번호변경 실패.");
			updatePwUri="user/member/find_password_reset";
		}

		
		
		return updatePwUri;
	}
	
	//로그아웃
	@RequestMapping(value="/logout_process.do",method = GET)
	public String logoutProcess(SessionStatus ss) {
	
		ss.setComplete();
		
		return "redirect:<http://salad.sist.co.kr/index.do>";
	}
	
	//이용약관동의화면이동
	@RequestMapping(value = "/agreement.do",method = GET)
	public String agreement(Model model) {
		

		List<KategoriePrdDomain> mainCateList=kpService.mainCateList();
		model.addAttribute("mainCateList",mainCateList);

		return "user/member/agreement";
	}
	
	//개인정보수집동의화면이동
	@RequestMapping(value = "/pprivate.do",method = GET)
	public String pprivate(Model model) {

		List<KategoriePrdDomain> mainCateList=kpService.mainCateList();
		model.addAttribute("mainCateList",mainCateList);

		return "user/member/pprivate";
	}

}

MemberService.java

package kr.co.salad.user.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import kr.co.salad.user.dao.MemberDAO;
import kr.co.salad.user.vo.MemberVO;

@Component
public class MemberService {
	
	@Autowired(required = false)
	private MemberDAO mDAO;

	//로그인 여부
		public String searchLogin(MemberVO mVO) {
			String loginName="";
			loginName=mDAO.selectLogin(mVO);
			return loginName;
		}
		
		//회원가입 추가
		public boolean addJoin(MemberVO mVO) {
			boolean joinFalg=false;
			
			joinFalg=mDAO.insertJoin(mVO);
			return true;
		}
		
		//아이디찾기 
		public String searchFindIdChk(MemberVO mVO) {
			String findName="";
			findName=mDAO.selectFindIdChk(mVO);
			
			return findName;
		}
		
		//중복아이디체크
		public int searchIdChk(String id) {
			
			return mDAO.selectIdChk(id); //중복아이디존재
		}
		
		//비밀번호 찾기 체크
		public boolean searchFindPassChk(MemberVO mVO) {
			boolean pwCh=false;
			pwCh=mDAO.selectFindPassChk(mVO);
					
			return pwCh;
		}
		
		//비밀번호 변경
		public int editPassReser(MemberVO mVO) {
			int editPw=0;
			editPw=mDAO.updatePassReser(mVO);
						
			return editPw; //변경완료
		}
}

MemberDAO.java

package kr.co.salad.user.dao;

import org.apache.ibatis.session.SqlSession;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component;

import kr.co.salad.user.vo.MemberVO;
import kr.co.salad.dao.handler.MyBatisHandler;

@Component
public class MemberDAO {
	
	//로그인 여부
	public String selectLogin(MemberVO mVO) {
		String name="";
		BCryptPasswordEncoder passEncoder=new BCryptPasswordEncoder();
		MyBatisHandler mbh=MyBatisHandler.getInstance();

		SqlSession session=mbh.getHandler();
		//쿼리실행
		MemberVO resultVO=session.selectOne("kr.co.salad.user.memberMapper.selectLogin", mVO);
		if(resultVO==null) {
			name="";
		}else {
			System.out.println(resultVO.getPass());
			if(passEncoder.matches(mVO.getPass(), resultVO.getPass())) { //암호화한 비밀번호와 입력한 비밀번호 비교
				System.out.println("회원정보 있음");
				name=resultVO.getName();
				session.commit();
			}else {
				System.out.println("회원정보 없음");
			}
		}
		
		
		//Handler 종료
		mbh.closeHandler(session);
		
		return name;
	}
	
	//회원가입 추가
	public boolean insertJoin(MemberVO mVO) {
		
		boolean joinFlag=false;
		
		MyBatisHandler mbh=MyBatisHandler.getInstance();
		
		
		SqlSession session=mbh.getHandler();
		
		//쿼리실행
		int mCnt=session.insert("kr.co.salad.user.memberMapper.insertMember", mVO);
		if(mCnt==1) { //select 값이 있어 
			System.out.println("회원추가");
			joinFlag=true;
			session.commit();
		}else {
			System.out.println("회원추가 실패");
		}
		
		//Handler 종료
		mbh.closeHandler(session);
		
		
		return joinFlag;
	}
	
	//아이디찾기 
	public String selectFindIdChk(MemberVO mVO) {
		String id=null;
		MyBatisHandler mbh=MyBatisHandler.getInstance();
		
		
		SqlSession session=mbh.getHandler();
		
		//쿼리실행
		String findID=session.selectOne("kr.co.salad.user.memberMapper.selectId", mVO);
		if(findID!=null) { //찾는 아이디가 있다
			System.out.println("찾은 아이디 "+findID);
			id=findID;
			session.commit();
		}else {
			System.out.println("아이디 찾기 실패");
		}
		
		//Handler 종료
		mbh.closeHandler(session);
			
		return id;
	}
	
	//중복아이디체크
	public int selectIdChk(String id) {
		int idChk=0;
		
		MyBatisHandler mbh=MyBatisHandler.getInstance();
		
		
		SqlSession session=mbh.getHandler();
		
		//쿼리실행
		String findID=session.selectOne("kr.co.salad.user.memberMapper.selectIdChk", id);
		if(findID!=null) { //찾는 아이디가 있다
			idChk=1;
			session.commit();
		}else {
		}
		
		//Handler 종료
		mbh.closeHandler(session);
		
		return idChk;
				
		
	}
	
	//비밀번호 찾기 회원확인
	public boolean selectFindPassChk(MemberVO mVO) {
		boolean pwChFlag=false;
		
		MyBatisHandler mbh=MyBatisHandler.getInstance();
		
		
		SqlSession session=mbh.getHandler();
		
		//쿼리실행
		String findID=session.selectOne("kr.co.salad.user.memberMapper.selectMemCh", mVO);
		if(findID!=null) { //찾는 아이디가 있다
			System.out.println("회원확인 완료");
			pwChFlag=true;
			session.commit();
		}else {
			System.out.println("회원확인 실패");
		}
		
		//Handler 종료
		mbh.closeHandler(session);
				
		return pwChFlag;
	}
	
	//비밀번호 변경
	public int updatePassReser(MemberVO mVO) {
		
		MyBatisHandler mbh=MyBatisHandler.getInstance();
	
		SqlSession session=mbh.getHandler();
		
		//쿼리실행
		int upCnt=session.update("kr.co.salad.user.memberMapper.updateMemCh", mVO);
		if(upCnt==1) { //변경된 비밀번호
			System.out.println("비밀번호 변경 완료");
			upCnt=1;
			session.commit();
		}else {
			System.out.println("비밀번호 변경 실패");
		}
		
		//Handler 종료
		mbh.closeHandler(session);	
					
		return upCnt; //변경완료
	}
	

}

memberMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "<https://mybatis.org/dtd/mybatis-3-mapper.dtd>">
<mapper namespace="kr.co.salad.user.memberMapper">
<!-- 로그인 -->
  <select id="selectLogin" parameterType="kr.co.salad.user.vo.MemberVO"  resultType="kr.co.salad.user.vo.MemberVO">
  		select id, pass,name 
  		from member
		where id=#{id} and out_flag=0
  </select>
  
  <select id="selectIdChk" parameterType="string"  resultType="string">
  		select id
  		from member
		where id=#{id}
  </select>
  
  <!-- 아이디찾기 -->
  <select id="selectId" parameterType="kr.co.salad.user.vo.MemberVO"  resultType="string">
  		select id 
  		from member
		where name=#{name} and email=#{email}
  </select>
  
  <!-- 비밀번호 회원확인 -->
  <select id="selectMemCh" parameterType="kr.co.salad.user.vo.MemberVO"  resultType="string">
  		select id 
  		from member
		where id=#{id} and name=#{name} and email=#{email}
  </select>
  
  <!-- 비밀번호 변경 -->
  <update id="updateMemCh" parameterType="kr.co.salad.user.vo.MemberVO">
 	 update member
  	 set pass=#{newPass}
  	 where id=#{id}
  </update>
  
  <!-- 회원가입 -->
  <insert id="insertMember" parameterType="kr.co.salad.user.vo.MemberVO">
  	insert into member(id,pass,name,email,phone,zipcode,addr,de_addr) 
  	values(#{id}, #{pass}, #{name}, #{email}, #{phone}, #{zipcode},#{addr}, #{deAddr})
  </insert>
</mapper>