2020년 12월 29일

업데이트:


회원 정보 조회

로그인이 되었을 때 출력하는 코드

회원 이름을 클릭 할 경우 Mypage로 넘어감 header.jsp

<c:otherwise>
<li class="nav-item active">
<%-- 로그인 회원의 이름을 가져와 출력 --%>
<a class="nav-link" href="${contextPath }/member/myPage.do">${loginMember.memberName}</a>
</li>
<li class="nav-item active">
<a class="nav-link" href="${contextPath}/member/logout.do">Logout</a>
</li>
</c:otherwise>


MyPage와 연결되는 서블릿

forward 하기 위해 MyPageServlet 생성 MyPageServlet.java

package com.kh.wsp.member.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/member/myPage.do")
public class MyPageServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 로그인 된 정보, DB와 Session에 담겨져 있다.
		
		String path = "/WEB-INF/views/member/myPage.jsp";
		RequestDispatcher view = request.getRequestDispatcher(path);
		view.forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}


페이지 좌측에 보이는 메뉴

sideMenu.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<div class="col-sm-4 mt-5">
	<h3>사이드 메뉴</h3>
	<ul class="list-group">
		<li class="list-group-item list-group-item-action"><a href="myPage.do">내정보</a></li>
		<li class="list-group-item list-group-item-action"><a href="changePwd.do">비밀번호 변경</a></li>
		<li class="list-group-item list-group-item-action"><a href="secession.do">회원 탈퇴</a></li>
	</ul>
</div>


myPage

myPage.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" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>내정보</title>
<style>
	input[type="number"]::-webkit-outer-spin-button, 
	input[type="number"]::-webkit-inner-spin-button
		{
		-webkit-appearance: none;
		margin: 0;
	}
</style>
</head>
<body>
	<div class="container">
		<jsp:include page="../common/header.jsp"></jsp:include>
		
		<%-- 전화번호, 주소를  구분자를 이용하여 분리된 배열 형태로 저장 --%>
		<%-- ${fn:split(문자열,구분자) } : 배열로 저장됨. --%> 
		<c:set var="phone" value="${fn:split(loginMember.memberPhone,'-') }"/>
		<c:set var="address" value="${fn:split(loginMember.memberAddress,', ') }"/>


    <div class="row my-5">
        <jsp:include page="sideMenu.jsp"></jsp:include>		
            
    <div class="col-sm-8">
        <h3>My Page</h3>
        <hr>
        <div class="bg-white rounded shadow-sm container p-3">
            <form method="POST" action="updateMember.do" onsubmit="return memberUpdateValidate();" class="form-horizontal" role="form">
            <!-- 아이디 -->
            <div class="row mb-3 form-row">
                <div class="col-md-3">
                    <h6>아이디</h6>
                </div>
                <div class="col-md-6">
                    <h5 id="id">${loginMember.memberId}</h5>
                </div>
            </div>

            <!-- 이름 -->
            <div class="row mb-3 form-row">
                <div class="col-md-3">
                    <h6>이름</h6>
                </div>
                <div class="col-md-6">
                    <h5 id="name">${loginMember.memberName} </h5>
                </div>
            </div>

            <!-- 전화번호 -->
            <div class="row mb-3 form-row">
                <div class="col-md-3">
                    <label for="phone1">전화번호</label>
                </div>
                <!-- 전화번호1 -->
                <div class="col-md-3">
                    <select class="custom-select" id="phone1" name="phone1">
                        <option>010</option>
                        <option>011</option>
                        <option>016</option>
                        <option>017</option>
                        <option>019</option>
                    </select>
                </div>
                

                <!-- 전화번호2 -->
                <div class="col-md-3">
                    <input type="number" class="form-control phone" id="phone2" name="phone2" value="${phone[1] }">
                </div>

                <!-- 전화번호3 -->
                <div class="col-md-3">
                    <input type="number" class="form-control phone" id="phone3" name="phone3" value="${phone[2] }">
                </div>
            </div>

            <!-- 이메일 -->
            <div class="row mb-3 form-row">
                <div class="col-md-3">
                    <label for="memberEmail">Email</label>
                </div>
                <div class="col-md-6">
                    <input type="email" class="form-control" id="email" name="email" value="${loginMember.memberEmail}">
                </div>
            </div>
            <br>

            <!-- 주소 -->
            <!-- 오픈소스 도로명 주소 API -->
            <!-- https://www.poesis.org/postcodify/ -->
            <div class="row mb-3 form-row">
                <div class="col-md-3">
                    <label for="postcodify_search_button">우편번호</label>
                </div>
                <div class="col-md-3">
                    <input type="text" name="post" class="form-control postcodify_postcode5" value="${address[0] }">
                </div>
                <div class="col-md-3">
                    <button type="button" class="btn btn-primary" id="postcodify_search_button">검색</button>
                </div>
            </div>

            <div class="row mb-3 form-row">
                <div class="col-md-3">
                    <label for="address1">도로명 주소</label>
                </div>
                <div class="col-md-9">
                    <input type="text" class="form-control postcodify_address" name="address1" id="address1"  value="${address[1] }">
                </div>
            </div>

            <div class="row mb-3 form-row">
                <div class="col-md-3">
                    <label for="address2">상세주소</label>
                </div>
                <div class="col-md-9">
                    <input type="text" class="form-control postcodify_details" name="address2" id="address2"  value="${address[2] }">
                </div>
            </div>


            <!-- 관심분야 -->
            <hr class="mb-4">
            <div class="row">
                <div class="col-md-3">
                    <label>관심 분야</label>
                </div>
                
                <div class="col-md-9 custom-control custom-checkbox">
                
                    <div class="form-check form-check-inline">
                        <input type="checkbox" class="form-check-input custom-control-input"
                            name="memberInterest" id="sports" value="운동">
                        <label class="form-check-label custom-control-label" for="sports">운동</label>
                    </div>
                    
                    <div class="form-check form-check-inline">
                        <input type="checkbox" class="form-check-input custom-control-input"
                            name="memberInterest" id="movie" value="영화">
                        <label class="form-check-label custom-control-label" for="movie">영화</label>
                    </div>
                    
                    <div class="form-check form-check-inline">
                        <input type="checkbox" class="form-check-input custom-control-input" 
                            name="memberInterest" id="music" value="음악">
                        <label class="form-check-label custom-control-label" for="music">음악</label>
                    </div>
                    <br>
                    
                    <div class="form-check form-check-inline">
                        <input type="checkbox" name="memberInterest" id="cooking"
                            value="요리" class="form-check-input custom-control-input">
                        <label class="form-check-label custom-control-label"
                            for="cooking">요리</label>
                    </div>
                    
                    <div class="form-check form-check-inline">
                        <input type="checkbox"  class="form-check-input custom-control-input" 
                            name="memberInterest" id="game" value="게임">
                        <label class="form-check-label custom-control-label" for="game">게임</label>
                    </div>
                    
                    <div class="form-check form-check-inline">
                        <input type="checkbox" class="form-check-input custom-control-input" 
                            name="memberInterest" id="etc" value="기타"> 
                        <label class="form-check-label custom-control-label" for="etc">기타</label>
                    </div>
                    
                </div>
            </div>

            <hr class="mb-4">
            <button class="btn btn-primary btn-lg btn-block" type="submit">수정</button>
                </form>
            </div>
        </div>
    </div>
</div>
<br><br>
	
	<jsp:include page="../common/footer.jsp"></jsp:include>
		
		
		
	<!-- postcodify를 로딩 -->
	<script src="//d1p7wdleee1q2z.cloudfront.net/post/search.min.js"></script>
	
	<!-- 회원 관련 Javascript 코드를 모아둘 wsp_member.js 파일을 작성 -->
	<script src="${contextPath}/resources/js/wsp_member.js"></script>
	
 		
	<script>
    /* 스크립트 코드에 EL/JSTL 이 포함된 경우 별도 js파일에 작성할 수 없다
    - js파일은 요청 시 클라이언트 측으로 전달되어져 브라우저가 해석하지만
        JSP(EL/JSTL)는 서버측에서 JAVA로 변환되고 해석되어야함.
        -> js파일에 작성하는 경우 EL/JSTL 코드가 해석되지 않은 상태로 클라이언트로 전달되어 
            의도한 형태로 해석되지 않는 문제가 발생함.
    */
    
    //  전화번호 첫 번재 자리(option 태그)를 회원 전화번호 첫 번째 자리와 일치하는 값으로 선택하기
    // (function(){})(); -> 즉시 처리 함수
    // 함수가 정의 되자마자 수행되는 함수, 변수명 충돌 현상 방지 + 속도적 측면에서 우위가 있음.
    (function(){
        
        // #phone1의 자식 중 option 태그들을 반복 접근
        $("#phone1 > option").each(function(index, item){
            // index : 현재 접근중인 인덱스
            // item : 현재 접근중인 요소
            
                // 현재 접근한 요소에 써져있는 값과 전화번호 배열의 첫번째 값이 같다면
            if( $(item).text() == "${phone[0]}"){
                // 현재 접근한 요소에 seleted라는 옵션을 추가
                $(item).prop("selected",true);
            }
        });
    })();		
				
		
    // 관심분야 중 회원 정보와 일치하는 부분 체크하기
    (function(){
        
        // 회원 정보에서 관심분야 문자열을 얻어와 ' , '를 구분자로 하여 분리하기
        var interest = "${loginMember.memberInterest}".split(",");
        
        // 체크 박스 요소를 모두 선택하여 반복 접근
        $("input[name='memberInterest']").each(function(index, item){
        
        // interest 배열 내에
        // 현재 접근 중인 체크박스의 value와 일치하는 요소가 있는지 확인
        if(interest.indexOf( $(item).val()) != -1 ){
            $(item).prop("checked", true);
        }
        });
    })();
		
		
	</script>

</body>
</html>



회원정보 화면


  1. 로그인 후 사용자의 이름을 클릭 이름 클릭

  2. 사용자의 정보 (sqlDeveloper) 데베

  3. 마이페이지 마이페이지



회원정보 수정

회원정보 수정 시 호출하는 함수

myPage.jsp

<form method="POST" action="updateMember.do" 
onsubmit="return memberUpdateValidate();" class="form-horizontal" role="form">


회원정보 수정에 필요한 코드

회원정보를 수정할 때도 유효성 검사를 해줘야된다.

wsp_member.js

// 회원 정보 수정--------------------------------------
// 회원 정보 수정 유효성 검사
function memberUpdateValidate(){
  
    // 유효성 검사를 저장할 객체 생성
    var updateCheck = {"phone2":false,
                        "email":false}

    var regExp1 = /^\d{3,4}$/; // 숫자 3~4 글자
	var regExp2 = /^\d{4,4}$/; // 숫자 4 글자
	var regExp3 = /^[\w]{4,}@[\w]+(\.[\w]+){1,3}$/;


    // 전화번호 유효성 검사
    var p2 = $("#phone2").val();
    var p3 = $("#phone3").val();
    if(!regExp1.test(p2) || !regExp2.test(p3)){
        updateCheck.phone2 = false;
    }else{
        updateCheck.phone2 = true;
    }

    // 이메일 유효성 검사
    if(!regExp3.test( $("#email").val() )){
        updateCheck.email = false;
    }else{
        updateCheck.email = true;
    }


    // updateCheck 내부에 저장된 값 검사
    for(var key in updateCheck){

        // 업데이트에서 가져온 값이 false 라면
        if(!updateCheck[key]){
            swal("일부 값이 유효하지 않습니다.");
            return false;
        }
    }
}


회원정보 유효성 검사 화면

  1. 기존 회원 정보 기존회원정보

  2. 유효성 검사 위반했을 때 잘못 수정햇을 때
    잘못 수정햇을 때2

회원정보 수정 servlet

package com.kh.wsp.member.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.kh.wsp.member.model.service.MemberService;
import com.kh.wsp.member.model.vo.Member;


@WebServlet("/member/updateMember.do")
public class UpdateMemberServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
  
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 전송된 파라미터를 변수에 저장
		String memberEmail = request.getParameter("email");
		
		String phone1 = request.getParameter("phone1");
		String phone2 = request.getParameter("phone2");
		String phone3 = request.getParameter("phone3");
		// 전화번호를 '-'를 구분자로 하여 하나로 합치기
		String memberPhone = phone1+"-"+phone2+"-"+phone3;
		
		String post = request.getParameter("post"); //우편번호
		String address1 = request.getParameter("address1"); // 도로명 주소
		String address2 = request.getParameter("address2"); // 상세주소
		// 주소를 ", "를 구분자로 하여 하나로 합치기
		String memberAddress = post+","+address1+","+address2;
		
		String[] interest = request.getParameterValues("memberInterest");
		String memberInterest = null;
		if(interest != null ) memberInterest = String.join(",", interest);
		
		// Session에 있는 로그인 정보를 얻어옴. -> 회원 번호 사용
		HttpSession session = request.getSession();
		Member loginMember = (Member)session.getAttribute("loginMember");
		
		// 얻어온 수정 정보와 회원 번호를 하나의 Member객체에 저장
		Member member = new Member();
		member.setMemberNo(loginMember.getMemberNo()); //회원번호
		member.setMemberEmail(memberEmail);
		member.setMemberPhone(memberPhone);
		member.setMemberAddress(memberAddress);
		member.setMemberInterest(memberInterest);
		
		try {
			// 비즈니스 로직 수행 후 결과 반환
			int result = new MemberService().updateMember(member);

			
			
			String swalIcon = null;
			String swalTitle = null;
			String swalText = null;
			
			if(result>0) {
				swalIcon = "success";
				swalTitle = "회원정보 수정 성공";
				swalText = "회원정보가 성공적으로 수정되었습니다.";
				
				// DB에는 정보가 수정되었지만 session에는 정보 수정이 되지않음.
				// session 정보 갱신해주기.
				
				// 기존 로그인 정보에서 id를 얻어와 갱신에 사용된 member객체에 저장
				member.setMemberId(loginMember.getMemberId());
				member.setMemberName(loginMember.getMemberName());
				member.setMemberGrade(loginMember.getMemberGrade());
				// -> member 객체가 갱신된 회원 정보를 모두 갖게됨.
				
				// Session에 있는 loginMember 정보를 member로 갱신
				session.setAttribute("loginMember", member);
				
			}else {
				swalIcon ="error";
				swalTitle ="회원정보 수정 실패";
				swalText = "회원정보 수정에 실패하였습니다.";
			}
			
			session.setAttribute("swalIcon", swalIcon);
			session.setAttribute("swalTitle", swalTitle);
			session.setAttribute("swalText", swalText);
			
			// 수정 완료 후 다시 내 정보 페이지로 재요청
			response.sendRedirect("myPage.do");
					     		// == mypageServlet (jsp로 요청 위임하는 곳)
								// -> myPage.jsp (세션에 있는 정보들을 이용해서 화면 출력하는 곳)
			
			//response.sendRedirect(request.getHeader("referer"));
			// 도 가능하다, (요청 이전페이지 = 마이페이지)
			
		}catch(Exception e) {
			e.printStackTrace();
			request.setAttribute("errorMsg", "회원 수정 과정에서 오류가 발생했습니다.");
			String path = "/WEB-INF/views/common/errorPage.jsp";
			RequestDispatcher view = request.getRequestDispatcher(path);
			view.forward(request,response);
			
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}


회원정보 수정 service

/** 회원정보 수정 Service
* @param member
* @return	result
* @throws Exception
*/
public int updateMember(Member member) throws Exception {
Connection conn = getConnection();

int result = dao.updateMember(conn,member);

if(result>0)  commit(conn);
else		  rollback(conn);

close(conn);

return result;
}


회원정보 수정 SQL

<entry key="updateMember">
UPDATE MEMBER 
SET MEMBER_EMAIL=?,
		MEMBER_PHONE=?,
		MEMBER_ADDR=?,
		MEMBER_INTEREST=?
WHERE MEMBER_NO=? 
</entry>


회원정보 수정 DAO

/** 회원정보 수정 DAO
* @param conn
* @param member
* @return	result
* @throws Exception
*/
public int updateMember(Connection conn, Member member) throws Exception {
int result = 0;

    String query = prop.getProperty("updateMember");
    
try {
    pstmt = conn.prepareStatement(query);
    pstmt.setString(1, member.getMemberEmail());
    pstmt.setString(2, member.getMemberPhone());
    pstmt.setString(3, member.getMemberAddress());
    pstmt.setString(4, member.getMemberInterest());
    pstmt.setInt(5, member.getMemberNo());
    
    result = pstmt.executeUpdate();
    
}finally {
    close(pstmt);
}

return result;
}



회원정보 수정 화면

  1. 수정 전 정보
    DB
    수정 전 DB

    내정보 화면
    수정전 정ㅈ보

  2. 수정 할 정보 정보 수정

  3. 수정 성공 수정성공

  4. 수정 된 정보
    DB
    수정 후 DB

    내정보 화면
    수정후정보





태그: , , ,

카테고리:

업데이트:

댓글남기기