앞으로 학습할 내용

- Model 2 회원관리 프로그램, 게시판 프로그램

- lib 폴더 안에 라이브러리 저장하는 대신 maven 으로 라이브러리 관리

- DB 접속 방법 중 MyBatis 사용해서 Model 1, Model 2 와의 연동

- (기존 DAO 클래스 안의 내용이 xml 로 처리됨)

- Spring 수업

 

+ JSP 와 오라클 연동 3가지 방법

 


 

+ session : 회원관리 부분에서만 사용, 로그인 ~ 로그아웃

 

프로젝트 구성도

- 회원가입폼, ID중복검사, 로그인 폼, 로그아웃 구현했다

- 이제 수정, 삭제(탈퇴) 기능을 해야함


회원관리 프로그램 : 정보수정

- 먼저 main.jsp 에서 '회원정보 수정' 에 링크를 걸어주자

- main.jsp (수정 전 4)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!-- 세션이 있는 경우 -->
<c:if test="${!empty sessionScope.id }">
<%-- <c:if test="${sessionScope.id != null }"> --%>
	${sessionScope.id} 님 환영 합니다. <br><br>
	
	<a href="./UpdateMember.do">회원정보 수정</a> <br>
	<a href="./Logout.do">로그아웃</a> <br>
	회원탈퇴 <br>
</c:if>
<!-- 세션이 없는 경우 -->
<c:if test="${empty sessionScope.id }">
<%-- <c:if test="${sessionScope.id == null}"> --%>
	<a href="<%=request.getContextPath() %>/MemberForm.do">회원가입 </a> <br>
	<a href="<%=request.getContextPath() %>/LoginForm.do">로그인 </a> <br>
</c:if>

- 요청이름값을 "/UpdateMember.do" 로 하자

- a href="./UpdateMember.do" 로 해주었다, 만약 안되면 앞에 프로젝트 명도 써야한다

+ 나중에 Service 클래스도 이름을 맞춰서 UpdateMember.java 로 만들기

- '회원정보 수정' 을 누르면 수정폼으로 이동한다, 수정폼에 사용자의 상세정보를 뿌려주기 위해 DB 연동 필요, Controller -> Service 로 가야한다

 

- Controller 에 연결하기 전에 Service 클래스인 UpdateMember.java 를 먼저 만들자

 

회원관리 프로그램 : 회원정보 수정폼 Service 클래스

- 회원 정보 수정폼을 처리하는 UpdateMember.java 파일을 만들자

- '회원정보 수정' 요청이름값과 동일하게 설정

- service 패키지에 UpdateMember.java 클래스 생성 및 작성

- UpdateMember.java

package service;

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

import dao.MemberDAO;
import model.MemberDTO;

public class UpdateMember implements Action{

	@Override
	public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("UpdateMember");
		
		HttpSession session = request.getSession();
		String id = (String)session.getAttribute("id");
		
		MemberDAO dao = MemberDAO.getInstance();
		MemberDTO member = dao.getMember(id);	// 1명의 상세정보 구하기
		System.out.println("수정폼:" + member);
		
		String hobby = member.getHobby();	// hobby = "공부-게임-등산-"
		String[] h = hobby.split("-");		// h[0] = "공부", h[1] = "게임", h[2] ="등산"
		
		// 공유 설정
		request.setAttribute("member", member);
		request.setAttribute("h", h);
		
		// request 객체로 공유를 한 경우에는 dispatcher 방식으로 포워딩을 해야 view 페이지에서 공유한 값에 접근 가능
		ActionForward forward = new ActionForward();
		forward.setRedirect(false);	// dispatcher 방식으로 포워딩
		forward.setPath("./member/updateform.jsp");
		return forward;
	}

}

- 진짜 수정 전에 id 로 1명의 상세정보를 구한 후 수정폼에 뿌려주는 역할을 해야한다

<회원 정보수정 Service 클래스 형식, 전체적인 흐름>

- 부모 인터페이스인 Action 인터페이스를 상속받기, 이클립스 자동 기능으로 execute() 를 메소드 오버라이딩 하기

- request 객체는 Controller 클래스의 getPost() -> getProcess() -> Service 클래스의 execute() 로 넘어온다

- ActionForward 객체 forward 생성 후 필드값을 설정해서 execute() 를 호출한 Controller 클래스에 돌려줌

- 진짜 수정 전에 id 로 1명의 상세정보를 구한 후 수정폼에 뿌려주는 역할을 해야한다

 

<회원 정보수정 Service 클래스 작성 순서>

1. id 를 통해 현재 로그인된 한명의 상세정보를 구해와야하므로 세션 값을 구해와야한다

- 먼저, session 객체를 생성하고 "id" 네임으로 세션에 공유된 id 를 가져온다

2. DAO 객체를 생성하고 회원 정보를 구해오는 하는 DAO 의 getMember() 메소드 호출

- getMember() 는 1명에 대한 정보를 검색하므로 리턴자료형은 DTO

3. getMember() 메소드로부터 리턴받은 member 객체와 취미를 request 객체로 공유설정

- 아래에 설명 : <DAO 에서 getMember() 로 회원 정보를 구한 뒤 다시 Service 클래스로 돌아왔을때>

4. 포워딩 방식과 포워딩 페이지 설정

- request 객체로 공유했으므로 포워딩 2가지 방법 중 dispatcher 방식으로 포워딩 해야 view 페이지에서 공유된 값을 가져올 수 있음

 

<DAO 에서 getMember() 로 회원 정보를 구한 뒤 다시 Service 클래스로 돌아왔을때>

* 아래의 DAO 를 작성 한 후 여기로 돌아왔다

- DAO로 부터 받아온 1명의 상세 정보를 저장하는 객체 member 전체를 공유설정해야한다

- 취미는 공유설정 전에, 객체 member 로 받은 값 중 취미를 가져와서 split() 로 잘라야한다, 그래야 수정폼에서 체크가 되어있게 할 수 있다

- 취미를 자른 후 각각의 취미를 배열 h에 저장하고 그 배열 h를 공유설정함

- 이후 포워딩 방식과 포워딩 페이지를 설정하고 객체 forward 를 리턴하며 다시 Controller 클래스로 돌아가서 updateform.jsp로 포워딩함

- request 객체로 공유했으므로 포워딩 2가지 방법 중 dispatcher 방식으로 포워딩 해야 view 페이지에서 공유된 값을 가져올 수 있음

 

* 아래에 DAO getMember() 메소드 작성

- 로그인 후 main.jsp 에서 '회원정보 수정' 클릭시

- Controller 클래스까지 잘 도착했고 command 에 알맞은 값이 들어갔음을 확인 가능

 

- Controller 클래스에서 요청을 Service 클래스로 연결시켜주자

 

Controller 클래스에서 회원정보 수정폼 Service 클래스로 가기

- MemberController.java 전체 코드는 나중에

- MemberController.java 부분

- /UpdateMember.do 로 요청이 올때의 경우를 처리

		// 회원정보 수정폼
		} else if(command.equals("/UpdateMember.do")) {
			try {
				action = new UpdateMember();
				forward = action.execute(request, response);
			} catch(Exception e) {
				e.printStackTrace();
			}
		}

 

- command 값, 즉 요청 이름값이 "/UpdateMember" 면 회원 정보 수정을 처리하는 UpdateMember 클래스로 객체 action 생성

- action 객체를 통해 UpdateMember() 클래스의 오버라이딩된 메소드인 execute() 를 실행하고 ActionForward 객체 forward 로 리턴받음

- execute() 를 호출하며 매개변수로는 doGet(), doPost() 의 매개변수인 request, response 를 전달함

- 나중에 execute() 가 실행된 후 Service 클래스에서 돌아올때는 Service 클래스에서 값이 설정된 forward 객체를 받아서 이 코드 아래의 포워딩 코드에서 포워딩 처리된다.

 

DAO 클래스 회원 1명 상세 정보 구하기 기능 메소드 작성

- MemberDAO.java 전체 코드는 모두 구현 후 올리기

- MemberDAO.java 추가된 getMember() 부분 코드만

	// 회원 1명 상세 정보 구하기 : 수정폼, 수정, 삭제
	public MemberDTO getMember(String id) {
		MemberDTO member = new MemberDTO();
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			con = getConnection();
			
			String sql = "select * from member2 where id=?";
			
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, id);
			rs = pstmt.executeQuery(); // SQL문 실행
			
			if(rs.next()) {
				member.setId(rs.getString("id"));
				member.setPasswd(rs.getString("passwd"));
				member.setName(rs.getString("name"));
				member.setJumin1(rs.getString("jumin1"));
				member.setJumin2(rs.getString("jumin2"));
				member.setMailid(rs.getString("mailid"));
				member.setDomain(rs.getString("domain"));
				member.setTel1(rs.getString("tel1"));
				member.setTel2(rs.getString("tel2"));
				member.setTel3(rs.getString("tel3"));
				member.setPhone1(rs.getString("phone1"));
				member.setPhone2(rs.getString("phone2"));
				member.setPhone3(rs.getString("phone3"));
				member.setPost(rs.getString("post"));
				member.setAddress(rs.getString("address"));
				member.setGender(rs.getString("gender"));
				member.setHobby(rs.getString("hobby"));
				member.setIntro(rs.getString("intro"));
				member.setRegister(rs.getTimestamp("register"));
			}
			
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(rs != null) try { rs.close(); } catch(Exception e) {}
			if(pstmt != null) try { pstmt.close(); } catch(Exception e) {}
			if(con != null) try { con.close(); } catch(Exception e) {}
		}
		return member;
	}

- 수정폼 뿐만 아니라, 수정, 삭제시에도 사용될 메소드이다

- 1명에 대한 정보, 즉 데이터 1개이므로 리턴 자료형은 DTO, 매개변수는 사용자의 id

- select문이므로 ResultSet 객체 rs 도 만들었음

- 이제 DAO -> Service 로 리턴되고, 넘어온 값들을 Service 에서 request 객체로 공유해야한다, dispatcher 방식 포워딩해야함

 

- 이제 포워딩될 수정폼 View 페이지인 updateform.jsp 를 생성해야한다

- member 폴더 안에 수정폼 updateform.jsp 를 생성 및 작성

- updateform.jsp

<%@page import="model.MemberDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 수정 폼</title>
<script src="http://code.jquery.com/jquery-latest.js"></script>

<script src="http://dmaps.daum.net/map_js_init/postcode.v2.js"></script>
<script>
	function openDaumPostcode() {
		new daum.Postcode({
			oncomplete : function(data) {
				// 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.
				// 우편번호와 주소 정보를 해당 필드에 넣고, 커서를 상세주소 필드로 이동한다.
//				document.getElementById('join_zip1').value = data.postcode1;
//				document.getElementById('join_zip2').value = data.postcode2;
				document.getElementById('post').value = data.zonecode;
				document.getElementById('address').value = data.address;
				
			}
		}).open();
	}
</script>


<!-- 외부 자바스크립트 파일 불러오기 -->
<script src="<%=request.getContextPath() %>/member/member.js"></script>


<script>
$(document).ready(function(){
	/* 취미 체크되도록 하기 */
	<c:forEach var="s" items="${h}">
		$("input:checkbox[name='hobby'][value='${s}']").attr("checked", true);
	</c:forEach>
	
	/* 라디오 버튼 체크  */
	$("input:radio[name='gender'][value='${member.gender}']").attr("checked", true);
});
</script>
<!-- 휴대폰 번호 첫번째 자리 선택-->
<script>
$(document).ready(function(){
	
	$("#phone1 option[value=${member.phone1 }]").attr("selected", true);
});
</script>
</head>
<body>

<form method="post" action="<%=request.getContextPath() %>/Update.do">
<input type="hidden" name="id" value="${member.id }">
<table border=1 width=500 align=center>
	<caption>회원 수정</caption>
	<tr><td>ID</td>
		<td>
		<%
			MemberDTO mem = (MemberDTO)request.getAttribute("member");
		%>
		<%=mem.getId() %> <br>
		${member.id}
		</td>
	</tr>
	<tr><td>비밀번호</td>
		<td><input type=password id="passwd" name="passwd"></td>
	</tr>
	<tr><td>성명</td>
		<td>
			<input type=text id="name" name="name" value="${member.name }">
		</td>
	</tr>
	<tr><td>주민번호</td>
		<td><input type=text size=6 maxlength=6 id="jumin1" 
		name="jumin1" value="${member.jumin1 }">-
			<input type=text size=7 maxlength=7 id="jumin2" 
		name="jumin2" value="${member.jumin2 }">
		</td>
	</tr>
	<tr><td>E-Mail</td>
		<td><input type=text size=10 id="mailid" 
		name="mailid" value="${member.mailid }">@
		    <input type=text size=10 id="domain" 
		name="domain" value="${member.domain }">
		    <select id="email">
		    	<option value="">직접입력</option>
		    	<option value="naver.com">네이버</option>
		    	<option value="daum.net">다음</option>
		    	<option value="nate.com">네이트</option>
		    	<option value="gmail.com">gmail</option>
		    </select>		    
		 </td>
	</tr>
	<tr><td>전화번호</td>
		<td><input type=text size=4 id="tel1" name="tel1" 
		maxlength=4 value="${member.tel1 }">-
			<input type=text size=4 id="tel2" name="tel2" 
		maxlength=4 value="${member.tel2 }">-
			<input type=text size=4 id="tel3" name="tel3" 
		maxlength=4 value="${member.tel3 }">
		</td>
	</tr>
	<tr><td>핸드폰</td>
		<td><select id="phone1" name="phone1">
				<option value="">번호선택</option>
				<option value="010">010</option>
				<option value="011">011</option>
				<option value="016">016</option>
				<option value="018">018</option>
				<option value="019">019</option>
			</select>-
			<input type=text size=4 id="phone2" name="phone2" 
			maxlength=4 value="${member.phone2 }">-
			<input type=text size=4 id="phone3" name="phone3" 
			maxlength=4 value="${member.phone3 }">
		</td>
	</tr>
	<tr><td>우편번호</td>
		<td><input type=text size=5 id="post" name="post" value="${member.post }">
			<input type=button value="우편번호검색" 
			       onClick="openDaumPostcode()">
		</td>
	</tr>
	<tr><td>주소</td>
		<td>
		<input type=text size=45 id="address" name="address" value="${member.address }">
		</td>
	</tr>
	<tr><td>성별</td>
		<td>
			<input type=radio id="male" name="gender" value="남자">남자
			<input type=radio id="female" name="gender" value="여자">여자
		</td>
	</tr>
	<tr><td>취미</td>
		<td>
			<input type="checkbox" id="h1" name="hobby" value="공부" checked>공부
			<input type="checkbox" id="h2" name="hobby" value="게임">게임
			<input type="checkbox" id="h3" name="hobby" value="등산">등산
			<input type="checkbox" id="h4" name="hobby" value="낚시">낚시
			<input type="checkbox" id="h5" name="hobby" value="쇼핑">쇼핑
		</td>
	</tr>	
	<tr><td>자기소개</td>
		<td>
			<textarea id="intro" name="intro" rows="5" cols="50" 
			placeholder="자기소개를 100자 이내로 입력하세요">${member.intro }
			</textarea>
		</td>
	</tr>
	<tr><td colspan=2 align=center>
			<input type=submit value="회원수정">
			<input type=reset value="취소" onClick="history.go(-1)">
		</td>
	</tr>		
</table>
</form>


</body>
</html>

0. memberform.jsp 파일 내용 복붙 후 수정

1. JSTL 코어 라이브러리를 불러오기

2. 수정폼에서 취미가 체크되도록 하는 처리를 한다 * 아래에 설명

3. 수정 시 요청하는 요청이름값을 /Update.do 로 하자, 폼태그의 action 값을 /Update.do 로 수정, 

4. id 값은 회원을 식별하는 기준이 되므로 id 값은 수정해선 안됨, id 입력양식 지우고 단순 출력하기 * 아래에 설명

5. 비밀번호를 제외한 입력양식 태그에 value 속성값들을 설정해서 뿌려준다

- 이름, 이메일 등 value 속성에서 EL 태그 사용해서 출력, textarea 는 태그 사이에 출력

- 휴대폰 첫번째 자리, 라디오박스 은 다른방식으로 처리한다 * 아래에 설명

6. '취소' 를 누르면 다시 main.jsp 로 돌아가도록 만들기

7. id 값은 Update.do 로 넘어가지 않기 때문에 hidden 으로 id 값을 전달


* 값 뿌리기 : 취미 체크 설정 (updateform.jsp 부분)

<!-- 취미 체크되도록 하기 -->
<script>
$(document).ready(function(){
	<c:forEach var="s" items="${h}">
		$("input:checkbox[name='hobby'][value='${s}']").attr("checked", true);
	</c:forEach>
})
</script>

- 공유 설정되어있는 취미를 저장한 배열 h 를 가져옴

- items 에 "${h}" 로 공유설정된 h 네임값의 값인 배열을 가져와서 forEach 태그로 각각의 원소(취미)를 s로 가져옴

- input type 이 checkbox 이고 name 값이 hobby이고, 그 취미 s를 value 로 가지고 있는 체크박스를 반복문에서 하나씩 선택해서 체크함

- 그럼 수정폼에서 체크표시가 되어 나타난다


* 값 뿌리기 : id 단순 출력하기 (updateform.jsp 부분)

- 공유설정되어있는 MemberDTO 객체 member 를 가져와야한다

- getAttribute() 를 할때 MemberDTO 로 다운캐스팅해야함

- EL 을 사용하지 않고 출력하는 방법, EL 로 출력하는 방법 둘 다 해보자 

 

- EL 을 사용하지 않고 출력하는 방법

		<%
			MemberDTO mem = (MemberDTO)request.getAttribute("member");
		%>
		<%=mem.getId() %>

- EL 을 사용해서 출력하는 방법

		${member.id}

- member 는 request 객체로 공유된 네임

- ${member} 는 member 라는 네임으로 공유된 객체 를 의미하고, ${member.id} 는 그 객체의 id 값을 출력하라는 의미

- .필드명을 쓴다고해서 id 필드에 직접 접근하는 것이 아님, 표기만 그럴뿐 실제로는 member.getId() 처럼 getter 메소드로 가져오는 것이다. 

 

- 다시 수정폼에 들어가보면 두 경우 다 id 를 잘 출력하고 있다

 

공유 시 주의

- setAttribute(A,B) 에서 A 는 네임이고 B는 값인데, B는 Object 형이다, 즉 모든 자료형이 다 올 수 있음

- getAttribute(A) 는 리턴 자료형이 Object 이다, 원래 저장되었던 자료형으로 다운캐스팅 해야한다


request 공유 값 크게 3가지 형태가 들어감, 값의 형태에 따라 공유값을 구해오는 방법

1. 기본자료형 변수 가 공유되었을때

- 그냥 공유네임 으로 구해오면 된다

ex) setAttribute("name","Lay") 였을때 "Lay" 를 가져오기

${name}

 

2. DTO 객체 가 공유되었을때

- 구해올때는 공유네임.필드명 으로 구해오면 된다

ex) 객체 member 에 대해 setAttribute("member",member) 를 했을때, 그 객체에서 id 값을 가져오고 싶다면

		${member.id}

ex) 객체 member 에 대해 setAttribute("member",member) 를 했을때, 그 객체에서 name 값을 가져오고 싶다면

			<input type=text id="name" name="name" value="${member.name }">

 

3. 배열, 리스트 가 공유되었을때

- 구해올 때는 공유네임이 forEach 태그의 items 값으로 들어가야한다

ex) String 배열  h 에 대해 setAttribute("h",h) 를 했을때, 그 배열의 원소들을 차례로 가져오고 싶다면

<!-- 취미 체크되도록 하기 -->
<script>
$(document).ready(function(){
	<c:forEach var="s" items="${h}">
		$("input:checkbox[name='hobby'][value='${s}']").attr("checked", true);
	</c:forEach>
})
</script>

+ forEach 태그는 더이상 원소값이 없을때까지 돌아간다


* 값 뿌리기 : 라디오버튼 체크 설정 (updateform.jsp 부분)

<!-- 라디오 버튼 체크 -->
<script>
$(document).ready(function(){
	$("input:radio[name='gender'][value='${member.gender}']").attr("checked", true);
	
})
</script>

- if 조건문을 사용해서 처리할 수도 있지만 jQuery 로 처리해보자

- gender 라는 컬럼에 "남자" 또는 "여자" 가 들어가 있다

- input type 이 radio 이고, name 값이 gender 이고, value 로 member 객체의 gender 필드값과 같은 값을 가지고 있는 라디오버튼 태그를 선택

 

- 그럼 수정폼에서 라디오버튼에 표시가 잘 나타난다


* 값 뿌리기 : 휴대폰 번호 첫번째 자리 (updateform.jsp 부분)

<!-- 휴대폰 번호 첫번째 자리 선ㄱ-->
<script>
$(document).ready(function(){
	
	$("#phone1 option[value=${member.phone1 }]").attr("selected", true);
});
</script>

- jQuery 로 처리하지 않으면 코드가 복잡해진다

- 가장 먼저 select 의 id 값으로 select 태그를 가져와야한다. #phone1 으로 id 값을 구하기

- 한칸 띄우면 자식 태그를 의미하므로 #phone option 으로 설정

- 그 option 태그들 중 value 가 ${"member.phone1"} 인 태그를 selected 한다

 

- updateform.jsp 작성 완료했다

- 이제 로그인 후 '회원정보 수정' 을 눌러서 수정폼으로 가자

 

- "/Update.do" 가 요청이름값이다

 

회원관리 프로그램 : 회원 정보수정 Service 클래스

- 실제 수정을 수행하는 Update.java 클래스를 service 패키지 안에 생성하자

- Update.java 파일에서 비번이 틀리면 다시 수정폼으로 돌아가도록 하고 비번이 맞으면 수정하자

- Update.java

package service;

import java.io.PrintWriter;

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

import dao.MemberDAO;
import model.MemberDTO;

public class Update implements Action{

	@Override
	public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("Update");
		
		response.setContentType("text/html; charset=utf-8");
		request.setCharacterEncoding("utf-8");
		
		PrintWriter out = response.getWriter();
		
		MemberDTO member = new MemberDTO();
		member.setId(request.getParameter("id"));
		member.setPasswd(request.getParameter("passwd"));
		member.setName(request.getParameter("name"));
		member.setJumin1(request.getParameter("jumin1"));
		member.setJumin2(request.getParameter("jumin2"));
		member.setMailid(request.getParameter("mailid"));
		member.setDomain(request.getParameter("domain"));
		member.setTel1(request.getParameter("tel1"));
		member.setTel2(request.getParameter("tel2"));
		member.setTel3(request.getParameter("tel3"));
		member.setPhone1(request.getParameter("phone1"));
		member.setPhone2(request.getParameter("phone2"));
		member.setPhone3(request.getParameter("phone3"));
		member.setPost(request.getParameter("post"));
		member.setAddress(request.getParameter("address"));
		member.setGender(request.getParameter("gender"));
		
		String[] hobby = request.getParameterValues("hobby");
		String h = "";
		for(String h1 : hobby) {
			h += h1 + "-";	// h = "공부-게임-"
		}
		member.setHobby(h);
		member.setIntro(request.getParameter("intro"));
		
		MemberDAO dao = MemberDAO.getInstance();
		MemberDTO old = dao.getMember(member.getId()); // 1명의 상세정보 구하기
		
		// 비번 비교
		if(old.getPasswd().equals(member.getPasswd())) { // 비번 일치시
			int result = dao.update(member);	// update SQL문 실행
			if(result == 1) System.out.println("회원 수정 성공");
		} else { // 비번 불일치시
			out.println("<script>");
			out.println("alert('비번이 일치하지 않습니다');");
			out.println("history.go(-1);");
			out.println("</script>");
			out.close();
			
			return null;
		}

		ActionForward forward = new ActionForward();
		forward.setRedirect(false);
		forward.setPath("./member/main.jsp");
		return forward;
	}

}

- 수정 폼에서 넘어온 값들을 처리하기 위한 Service 클래스

 

<회원 정보수정 Service 클래스 형식, 전체적인 흐름>

- 부모 인터페이스인 Action 인터페이스를 상속받기, 이클립스 자동 기능으로 execute() 를 메소드 오버라이딩 하기

- request 객체는 Controller 클래스의 getPost() -> getProcess() -> Service 클래스의 execute() 로 넘어온다

- ActionForward 객체 forward 생성 후 필드값을 설정해서 execute() 를 호출한 Controller 클래스에 돌려줌

- 수정 전에 id 로 DB에서 사용자의 비밀번호를 가져온 후 일치되어야 수정한다

 

<회원 정보수정 Service 클래스 작성 순서>

1. 한글값 인코딩, 한글 문서 인코딩

- 수정폼에서 한글값이 넘어오므로 한글값 인코딩 request.setCharacterEncoding()

- 한글 문서(값) 깨지지 않도록 인코딩 response.setContentType()

2. memberInsert.java 의 일부 내용을 가져와서 붙여넣기

3. DB에 저장된 비밀번호와 사용자가 입력한 비밀번호(member 객체 안에 저장되어있음)를 비교한다

- 수정폼에서 사용했던 1명의 상세정보를 구하는 getMember() 메소드를 사용해서 1명의 상세정보를 구해옴

- 그 상세정보에서 비밀번호만 가져오면 된다 old.passwd

4. 사용자가 입력한 비밀번호가 DB의 비밀번호와 일치시 수정을 하는 DAO 메소드 Update() 를 호출

* DAO 클래스는 아래에 작성

5. 비밀번호가 불일치시 out 객체를 사용해서 자바스크립트로 메세지 출력

- 먼저 out 객체를 생성, 출력하기, out 객체 닫기

- return null 로 해야 아래를 실행하지 않기때문에 history.go(-1) 에 의해 다시 수정폼으로 돌아갈때 에러나지 않음

+ out 객체 안에 자바스크립트 코드 작성 가능, 바깥에 " " 면 안은 ' '

6. forward 객체에 포워딩 방식, 포워딩 페이지 설정

- 아직 session 이 끊어지지 않았으므로 redirect, dispatcher 방식 포워딩 둘 다 사용 가능

- 수정이 끝나면 main.jsp 로 돌아가도록 한다

 

- 이후 Controller 클래스에서 수정폼에서 들어온 "/Update.do" 요청을 Update.java Service 클래스로 넘겨주는 처리를 하자

- 즉 Controller 클래스에서 연결시켜주자

 

Controller 클래스에서 회원정보 수정 Service 클래스로 가기

- MemberController.java 전체 코드는 나중에

- MemberController.java 부분

- /Update.do 로 요청이 올때의 경우를 처리

		// 회원정보 수정
		} else if(command.equals("/Update.do")) {
			try {
				action = new Update();
				forward = action.execute(request, response);
			} catch (Exception e){
				e.printStackTrace();
			}
		}

- 이러면 "/Update.do" 요청을 Controller 클래스에서 Update.java Service 클래스로 보내줌

 

DAO 클래스 회원정보 수정 기능 메소드 작성

- MemberDAO.java 전체 코드는 모두 구현 후 올리기

- MemberDAO.java 추가된 Update() 부분 코드만

	// 회원정보 수정
	public int update(MemberDTO member) {
		int result = 0;
		Connection con = null;
		PreparedStatement pstmt = null;

		try {
			con = getConnection();
			
			String sql = "update member2 set name=?,jumin1=?,jumin2=?,mailid=?,";
			sql += "domain=?,tel1=?,tel2=?,tel3=?,phone1=?,phone2=?,phone3=?,";
			sql += "post=?,address=?,gender=?,hobby=?,intro=? where id=?";
			
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, member.getName());
			pstmt.setString(2, member.getJumin1());
			pstmt.setString(3, member.getJumin2());
			pstmt.setString(4, member.getMailid());
			pstmt.setString(5, member.getDomain());
			pstmt.setString(6, member.getTel1());
			pstmt.setString(7, member.getTel2());
			pstmt.setString(8, member.getTel3());
			pstmt.setString(9, member.getPhone1());
			pstmt.setString(10, member.getPhone2());
			pstmt.setString(11, member.getPhone3());
			pstmt.setString(12, member.getPost());
			pstmt.setString(13, member.getAddress());
			pstmt.setString(14, member.getGender());
			pstmt.setString(15, member.getHobby());
			pstmt.setString(16, member.getIntro());
			pstmt.setString(17, member.getId());

			result = pstmt.executeUpdate();	// SQL문 실행
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch(Exception e) {}
			if(con != null) try { con.close(); } catch(Exception e) {}
		}
		return result;
	}

 

- 다 완성되었다

- 로그인폼에서 로그인 한 후 main.jsp 에서 '회원정보 수정' 으로 수정폼으로 가서 수정해보자

- 맞는 비밀번호 입력시

- 회원정보가 잘 수정된 후 main.jsp 로 왔다

- 다시 수정폼에 들어가보면 정보가 수정되었음을 확인 가능

- 콘솔창


회원관리 프로그램 : 회원 탈퇴

- 먼저 main.jsp 에서 '회원탈퇴' 에 링크를 걸어주자

- main.jsp (수정 후, 최종, 수정 전 4 다음 코드)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!-- 세션이 있는 경우 -->
<c:if test="${!empty sessionScope.id }">
<%-- <c:if test="${sessionScope.id != null }"> --%>
	${sessionScope.id} 님 환영 합니다. <br><br>
	
	<a href="./UpdateMember.do">회원정보 수정</a> <br>
	<a href="./Logout.do">로그아웃</a> <br>
	<a href="./DeleteMember.do">회원탈퇴</a> <br>
</c:if>
<!-- 세션이 없는 경우 -->
<c:if test="${empty sessionScope.id }">
<%-- <c:if test="${sessionScope.id == null}"> --%>
	<a href="<%=request.getContextPath() %>/MemberForm.do">회원가입 </a> <br>
	<a href="<%=request.getContextPath() %>/LoginForm.do">로그인 </a> <br>
</c:if>

- 회원탈퇴 클릭시 콘솔창

- "/DeleteMember.do" 로 요청해서 회원 탈퇴폼으로 갈 것

- 회원탈퇴 폼으로 갔을때는 DB연동이 필요하지 않으므로 Service 클래스로 갈 필요 없다

 

- Controller 클래스에서 "/DeleteMember.do" 요청을 처리하는 코드를 작성하자

 

Controller 클래스에서 회원 탈퇴폼 Service 클래스로 가기-

- MemberController.java 전체 코드는 나중에

- MemberController.java 부분

- /DeleteMember.do 로 요청이 올때의 경우를 처리

		// 회원탈퇴 폼
		} else if(command.equals("/DeleteMember.do")) {
			forward = new ActionForward();
			forward.setRedirect(false);
			forward.setPath("./member/deleteform.jsp");
		}

- DB연동하지 않으므로 Service 클래스로 가지 않아도 된다

- ActionForward 객체 foward 를 생성하고 forward 객체 값 설정

- 그리고 deleteform.jsp 로 포워딩

 

- 이제 member 폴더 하위에 삭제폼 deleteform.jsp 를 생성 및 작성

- deleteform.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 삭제 폼</title>
<script src="http://code.jquery.com/jquery-latest.js"></script>

<!-- 외부 자바스크립트 파일 불러오기 -->
<script src="<%=request.getContextPath() %>/member/member.js"></script>

</head>
<body>

<form method="post" action="<%=request.getContextPath() %>/Delete.do">
<input type="hidden" name="id" value="${sessionScope.id }">
<table border=1 width=500 align=center>
	<caption>회원 삭제</caption>
	<tr><td>비밀번호</td>
		<td><input type=password id="passwd" name="passwd"></td>
	</tr>
	<tr><td colspan=2 align=center>
			<input type=submit value="회원삭제">
			<input type=reset value="취소" onClick="history.go(-1)">
		</td>
	</tr>		
</table>
</form>

</body>
</html>

- updateform.jsp 내용을 복붙 후 많은 내용 삭제 및 수정

- 비번만 맞으면 탈퇴시키기 위해 삭제 폼에서 비번을 입력받아야함

- 아이디와 비밀번호만 "/Delete.do" 로 넘기면 된다

- 아이디를 넘길때는 sessionScope.id 로 공유된 세션에서 id 를 가져와서 hidden 으로 /Delete.do 로 넘김

- form 태그 action 을 "Delete.do" 로 바꿈, 즉 삭제를 할때 "/Delete.do" 로 요청할 것

- 이제 삭제폼에서 비번 입력 후 '회원삭제' 클릭 시 "/Delete.do" 로 요청한다

- 삭제폼 까지 완료했다, main.jsp 에서 '회원 탈퇴' 클릭시 콘솔창

 

회원관리 프로그램 : 회원 탈퇴 Service 클래스

- 실제 삭제 수행하는 Delete.java 클래스를 service 패키지 안에 생성하자

- Delete.java 파일에서 비번이 틀리면 다시 수정폼으로 돌아가도록 하고 비번이 맞으면 수정하자

- Delete.java

package service;

import java.io.PrintWriter;

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

import dao.MemberDAO;
import model.MemberDTO;

public class Delete implements Action{

	@Override
	public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("Delete");
		
		response.setContentType("text/html; charset=utf-8");
		request.setCharacterEncoding("utf-8");
	
		PrintWriter out = response.getWriter();
		HttpSession session = request.getSession();
		
		String id = request.getParameter("id");
		String passwd = request.getParameter("passwd");
		
		MemberDAO dao = MemberDAO.getInstance();
		MemberDTO old = dao.getMember(id);	// 1명의 상세 정보 구하기
		
		// 비번 비교
		if(old.getPasswd().equals(passwd)) {	// 비번 일치시
			int result = dao.delete(id);
			if(result == 1) System.out.println("회원탈퇴 성공");
			
			session.invalidate(); // 세션 삭제
		} else {	// 비번 불일치시
			out.println("<script>");
			out.println("alert('비번이 일치하지 않습니다.');");
			out.println("history.go(-1);");
			out.println("</script>");
			out.close();
			
			return null;
		}
		
		ActionForward forward = new ActionForward();
		forward.setRedirect(false);
		forward.setPath("./member/loginform.jsp");
		return forward;
	}

}

1. 현재 문서의 한글값 인코딩, 한글값이 넘어올 수 있으므로 한글값 인코딩

2. out 객체(출력스트림 객체) 생성, 회원 삭제를 하면 세션을 끊어야하므로 session 객체 생성

3. hidden 으로 넘어온 id 값과, 비번 입력양식에 넘어온 비번값을 받아서 변수에 저장

4. DB에서 비번을 가져와서 사용자가 삭제폼에 입력한 비번과 일치하는지 확인

- 수정폼에서 사용했던 1명의 상세정보를 구하는 메소드인 getMember() 로 상세 정보를 구해서 거기서 비번 가져오기

5. 비번이 일치하면 DAO 의 delete() 메소드를 호출해서 회원 삭제, 세션을 invalidate() 메소드로 강제 삭제

6. 비번 불일치시 out 객체를 사용해서 자바스크립트로 메세지 박스를 뿌리고, 이전 페이지인 main.jsp 로 이동

- return null 로 빠져나가서 아래의 forward 관련 코드 실행 못하도록 하기

7. ActionForward 객체 forward 로 포워딩 방식, 포워딩 페이지 설정

- return null 때문에 이 코드는 비번이 틀리면 수행하지 않음, 비번이 맞고, 회원탈퇴에 성공한 경우에만 실행됨

- 회원 탈퇴 성공 후 포워딩 될 페이지는 loginform.jsp

- 이후 이 Service 클래스의 execute() 를 부른 Controller 클래스로 다시 돌아감

 

- "/Delete.do" 로 요청이 왔을때 이 Service 페이지로 오도록  Controller 클래스에 연결해주는 코드를 작성하자

* DAO delete() 메소드 작성은 Controller 클래스 작성 아래에

 

Controller 클래스에서 회원 탈퇴 Service 클래스로 가기

- MemberController.java 전체 코드는 나중에

- MemberController.java 부분

- /Delete.do 로 요청이 올때의 경우를 처리

		// 회원 탈퇴
		} else if(command.equals("/Delete.do")) {
			try {
				action = new Delete();
				forward = action.execute(request, response);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

 

DAO 클래스 회원 탈퇴 (삭제) 기능 메소드 작성

	// 회원 탈퇴
	public int delete(String id) {
		int result = 0;
		
		Connection con = null;
		PreparedStatement pstmt = null;

		try {
			con = getConnection();
			
			String sql = "delete from member2 where id=?";
			
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, id);
			result = pstmt.executeUpdate(); // SQL문 실행
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch(Exception e) {}
			if(con != null) try { con.close(); } catch(Exception e) {}
		}
		return result;
	}

- id 를 받아서 그 한명의 정보를 삭제 하면 된다

- 이걸 실행 후 DAO -> Service 클래스 -> Controller 클래스 로 돌아간다

 

회원관리 프로그램 : 초기 페이지

- index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
모델2 회원관리

<script>
	location.href = "./LoginForm.do"
</script>
</body>
</html>

- 실행 시 바로 로그인 폼으로 넘어가도록 한다

- "./LoginForm.do" 로 요청 시 Controller 클래스에서 로그인 폼으로 넘어감

 

- 삭제 기능이 잘 구현되었는지 확인해보자

- 현재 프로젝트 model2member 를 선택하고 오른쪽 마우스 : Run As -> Run on Server 선택시 실행된다

1. 자동으로 index.html 로 가서 로그인 페이지를 띄움

2. 로그인 후 main.jsp 로 가기

3. '회원탈퇴' 클릭 후 삭제 폼에 맞는 비번 입력

 

4. 삭제시 로그인 폼으로 다시 넘어간다

- DB 에서 삭제 확인

- 삭제 되었다, 삭제 기능 잘 구현되었음

 

문제점

- 가입 / 로그인 / 수정 / 삭제 성공 시 '수정 성공' , '삭제 성공' 와 같은 메세지가 뜨지 않는다

- out 객체를 MemberInsert.java 에 생성해서 out.println("alert();") 로 alert 창을 띄울 수 없다

 

문제 해결

- MemberInsert.java 에서 회원가입 성공 후 '회원가입' 성공 alert 메세지를 띄워보자

- out 객체를 MemberInsert.java 에 생성해서 out.println("alert()") 로 alert 창을 띄울 수 없으므로

- 따로 출력을 위한 jsp 파일을 만들어서 location 객체를 사용해서 이동해야한다

- 그리고 아래 이 코드 주석 처리한다, 성공 후 Controller 에서 포워딩 되지 않고 위처럼 location.href 로 result.jsp 로 가므로 아래에 return null; 을 해준다

- 이제 member 폴더 하위에 result.jsp 를 만들자

 

- result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>

<script>
alert("회원가입 성공");
location.href = "<%=request.getContextPath()%>/LoginForm.do"
</script>

 

- 이제 회원가입을 시키면 성공 메세지가 뜨고 로그인 폼으로 넘어간다

 

- 이제 '회원가입 성공' 메시지가 제대로  뜬다

 


Controller 클래스 완성본

- MemberController.java (최종, 전체 코드)

package 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 service.Action;
import service.ActionForward;
import service.Delete;
import service.IdCheck;
import service.Login;
import service.MemberInsert;
import service.Update;
import service.UpdateMember;

/**
 * Servlet implementation class MemberController
 */
@WebServlet("*.do")	// do 확장자
public class MemberController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	// doGet(), doPost() 메소드에서 공통적인 작업을 처리하는 메소드
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String requestURI = request.getRequestURI();
		String contextPath = request.getContextPath();
		String command = requestURI.substring(contextPath.length());
		
		System.out.println("requestURI : " + requestURI); // requestURI : /model2member/Login.do
		System.out.println("contextPath : " + contextPath); // contextPath : /model2member
		System.out.println("command : " + command); // command : /Login.do
		
		Action action = null;
		ActionForward forward = null;
		
		// 회원가입
		if(command.equals("/MemberInsert.do")) {
			try {
				action = new MemberInsert();
				forward = action.execute(request, response);
				
			} catch (Exception e){
				e.printStackTrace();
			}
		// ID중복 검사 (ajax)
		} else if (command.equals("/Idcheck.do")) {
			try {
				action = new IdCheck();
				forward = action.execute(request, response);
			}
			catch (Exception e){
				e.printStackTrace();
			}
		// 회원가입 폼
		} else if (command.equals("/MemberForm.do")){
			forward = new ActionForward();
			forward.setRedirect(false);
			forward.setPath("./member/memberform.jsp");

		// 로그인 (회원 인증)
		} else if(command.equals("/Login.do")) {
			try {
				action = new Login();
				forward = action.execute(request, response);
			}
			catch (Exception e){
				e.printStackTrace();
			}
		// 로그인 폼	
		} else if(command.equals("/LoginForm.do")) {
			forward = new ActionForward();
			forward.setRedirect(false);
			forward.setPath("./member/loginform.jsp");
			
		// 로그아웃
		} else if(command.equals("/Logout.do")) {
			forward = new ActionForward();
			forward.setRedirect(false);
			forward.setPath("./member/logout.jsp");
			
		// 회원정보 수정폼
		} else if(command.equals("/UpdateMember.do")) {
			try {
				action = new UpdateMember();
				forward = action.execute(request, response);
			} catch(Exception e) {
				e.printStackTrace();
			}
		// 회원정보 수정
		} else if(command.equals("/Update.do")) {
			try {
				action = new Update();
				forward = action.execute(request, response);
			} catch (Exception e){
				e.printStackTrace();
			}
		// 회원탈퇴 폼
		} else if(command.equals("/DeleteMember.do")) {
			forward = new ActionForward();
			forward.setRedirect(false);
			forward.setPath("./member/deleteform.jsp");
		// 회원 탈퇴
		} else if(command.equals("/Delete.do")) {
			try {
				action = new Delete();
				forward = action.execute(request, response);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		// 포워딩 처리
		if(forward != null) {
			if(forward.isRedirect()) {	// redirect 방식으로 포워딩
				response.sendRedirect(forward.getPath());
			} else {				// dispatcher 방식으로 포워딩
				RequestDispatcher dispatcher = 
						request.getRequestDispatcher(forward.getPath());
				dispatcher.forward(request, response);
			}
		}
		
		
	} // doProcess() end

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("get");
		doProcess(request, response);	// doProcess() 호출
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("post");
		doProcess(request, response);	// doProcess() 호출
	}

}

DAO 클래스 완성본

- MemberDAO.java (최종, 전체 코드)

// DAO (Date Access Object)
package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import model.MemberDTO;

public class MemberDAO {

	// 싱글톤 : 객체 생성을 한번만 수행 하는 것.
	private static MemberDAO instance = new MemberDAO();
	
	public static MemberDAO getInstance() {
		return instance;
	}
	
	// 커넥션풀에서 커넥션을 구해오는 메소드
	private Connection getConnection() throws Exception {
 		Context init = new InitialContext();
  		DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/orcl");
  		return ds.getConnection();
	}
	
	// 회원가입
	public int insert(MemberDTO member) {
		int result = 0;
		Connection con = null;
		PreparedStatement pstmt = null;
		try {
			con = getConnection();
			
			String sql = "insert into member2 ";
			sql += "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,sysdate)";
			
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, member.getId());
			pstmt.setString(2, member.getPasswd());
			pstmt.setString(3, member.getName());
			pstmt.setString(4, member.getJumin1());
			pstmt.setString(5, member.getJumin2());
			pstmt.setString(6, member.getMailid());
			pstmt.setString(7, member.getDomain());
			pstmt.setString(8, member.getTel1());
			pstmt.setString(9, member.getTel2());
			pstmt.setString(10, member.getTel3());
			pstmt.setString(11, member.getPhone1());
			pstmt.setString(12, member.getPhone2());
			pstmt.setString(13, member.getPhone3());
			pstmt.setString(14, member.getPost());
			pstmt.setString(15, member.getAddress());
			pstmt.setString(16, member.getGender());
			pstmt.setString(17, member.getHobby());
			pstmt.setString(18, member.getIntro());

			result = pstmt.executeUpdate(); // SQL문 실행
			
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch(Exception e) {}
			if(con != null) try { con.close(); } catch(Exception e) {}
		}
		return result;
	}
	
	// ID중복 검사 (ajax)
	public int idcheck(String id) {
		int result = 0;
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			con = getConnection();
			
			String sql = "select * from member2 where id = ?";
			
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, id);
			rs = pstmt.executeQuery();	// SQL문 실행
			
			if(rs.next()) {
				result = 1;	// 중복 ID
			} else {
				result = -1; // 사용 가능한 ID
			}
			
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(rs != null) try { rs.close(); } catch(Exception e) {}
			if(pstmt != null) try { pstmt.close(); } catch(Exception e) {}
			if(con != null) try { con.close(); } catch(Exception e) {}
		}
		return result;
	}
	
	// 로그인 (회원인증)
	public int memberAuth(String id, String passwd) {
		int result = 0;
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			con = getConnection();
			
			String sql = "select * from member2 where id = ? and passwd=?";
			
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, id);
			pstmt.setString(2, passwd);
			rs = pstmt.executeQuery();	//SQL문 실행
			
			if(rs.next()) {	// 회원인증 성공
				result = 1;
			} else {		// 회원인증 실패
				result = -1;
			}
			
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(rs != null) try { rs.close(); } catch(Exception e) {}
			if(pstmt != null) try { pstmt.close(); } catch(Exception e) {}
			if(con != null) try { con.close(); } catch(Exception e) {}
		}
	return result;
	}
	
	// 회원 1명 상세 정보 구하기 : 수정폼, 수정, 삭제
	public MemberDTO getMember(String id) {
		MemberDTO member = new MemberDTO();
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			con = getConnection();
			
			String sql = "select * from member2 where id=?";
			
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, id);
			rs = pstmt.executeQuery(); // SQL문 실행
			
			if(rs.next()) {
				member.setId(rs.getString("id"));
				member.setPasswd(rs.getString("passwd"));
				member.setName(rs.getString("name"));
				member.setJumin1(rs.getString("jumin1"));
				member.setJumin2(rs.getString("jumin2"));
				member.setMailid(rs.getString("mailid"));
				member.setDomain(rs.getString("domain"));
				member.setTel1(rs.getString("tel1"));
				member.setTel2(rs.getString("tel2"));
				member.setTel3(rs.getString("tel3"));
				member.setPhone1(rs.getString("phone1"));
				member.setPhone2(rs.getString("phone2"));
				member.setPhone3(rs.getString("phone3"));
				member.setPost(rs.getString("post"));
				member.setAddress(rs.getString("address"));
				member.setGender(rs.getString("gender"));
				member.setHobby(rs.getString("hobby"));
				member.setIntro(rs.getString("intro"));
				member.setRegister(rs.getTimestamp("register"));
			}
			
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(rs != null) try { rs.close(); } catch(Exception e) {}
			if(pstmt != null) try { pstmt.close(); } catch(Exception e) {}
			if(con != null) try { con.close(); } catch(Exception e) {}
		}
		return member;
	}
	// 회원정보 수정
	public int update(MemberDTO member) {
		int result = 0;
		Connection con = null;
		PreparedStatement pstmt = null;

		try {
			con = getConnection();
			
			String sql = "update member2 set name=?,jumin1=?,jumin2=?,mailid=?,";
			sql += "domain=?,tel1=?,tel2=?,tel3=?,phone1=?,phone2=?,phone3=?,";
			sql += "post=?,address=?,gender=?,hobby=?,intro=? where id=?";
			
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, member.getName());
			pstmt.setString(2, member.getJumin1());
			pstmt.setString(3, member.getJumin2());
			pstmt.setString(4, member.getMailid());
			pstmt.setString(5, member.getDomain());
			pstmt.setString(6, member.getTel1());
			pstmt.setString(7, member.getTel2());
			pstmt.setString(8, member.getTel3());
			pstmt.setString(9, member.getPhone1());
			pstmt.setString(10, member.getPhone2());
			pstmt.setString(11, member.getPhone3());
			pstmt.setString(12, member.getPost());
			pstmt.setString(13, member.getAddress());
			pstmt.setString(14, member.getGender());
			pstmt.setString(15, member.getHobby());
			pstmt.setString(16, member.getIntro());
			pstmt.setString(17, member.getId());

			result = pstmt.executeUpdate();	// SQL문 실행
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch(Exception e) {}
			if(con != null) try { con.close(); } catch(Exception e) {}
		}
		return result;
	}
	// 회원 탈퇴
	public int delete(String id) {
		int result = 0;
		
		Connection con = null;
		PreparedStatement pstmt = null;

		try {
			con = getConnection();
			
			String sql = "delete from member2 where id=?";
			
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, id);
			result = pstmt.executeUpdate(); // SQL문 실행
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch(Exception e) {}
			if(con != null) try { con.close(); } catch(Exception e) {}
		}
		return result;
	}
}

 

+ Recent posts