1. 개요

2. DB 테이블 생성


3. 기능 구현
1) 메인 페이지
- 로그아웃 상태일 경우 로그인 페이지로 이동한다
- 로그인 상태일 경우 회원의 이름과 함께 환영 문구를 띄우고, 로그아웃 버튼과 정보수정 버튼을 표시한다
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
if(session.getAttribute("ValidMem") == null) {
%>
<jsp:forward page="login.jsp"></jsp:forward> <!-- 로그아웃 상태라면 로그인 페이지로 이동 -->
<%
}
// 세션에서 정보를 받아와 변수에 저장
String name = (String)session.getAttribute("name");
String id = (String)session.getAttribute("id");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인 화면</title>
</head>
<body>
<h1><%= name %>님 안녕하세요.</h1><br /> <!-- 로그인한 회원 이름 표시 -->
<form action="logout.jsp" method="post"> <!-- 로그아웃 버튼과 정보수정 버튼 클릭시 동작 -->
<input type="submit" value="로그아웃"> <input type="button" value="정보수정" onclick="javascript:window.location='modify.jsp'">
</form>
</body>
</html>

2) 커넥션 풀
- DAO와 DTO 기능을 모듈화 하여 분리해둔다
① MemberDAO.java
package com.javalec.memberDAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class MemberDAO {
// True/False로 사용할 0/1 값을 static final 변수에 저장하여 코드 가독성을 높임
public static final int MEMBER_NONEXISTENT = 0;
public static final int MEMBER_EXISTENT = 1;
public static final int MEMBER_JOIN_FAIL = 0;
public static final int MEMBER_JOIN_SUCCESS = 1;
public static final int MEMBER_LOGIN_PW_NO_GOOD = 0;
public static final int MEMBER_LOGIN_SUCCESS = 1;
public static final int MEMBER_LOGIN_IS_NOT = -1;
private static MemberDAO instance = new MemberDAO();
private MemberDAO() {
}
public static MemberDAO getInstance() {
return instance;
}
// 입력받은 회원 정보를 DB에 저장
public int insertMember(MemberDTO dto) {
int ri = 0;
Connection con = null;
PreparedStatement pstmt = null;
String query = "insert into members values (?,?,?,?,?,?)";
try {
con = getConnection();
pstmt = con.prepareStatement(query);
pstmt.setString(1, dto.getId());
pstmt.setString(2, dto.getPw());
pstmt.setString(3, dto.getName());
pstmt.setString(4, dto.geteMail());
pstmt.setTimestamp(5, dto.getrDate());
pstmt.setString(6, dto.getAddress());
pstmt.executeUpdate();
ri = MemberDAO.MEMBER_JOIN_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(pstmt != null) pstmt.close();
if(con != null) con.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return ri;
}
// 아이디 중복 확인
public int confirmId(String Id) {
int ri = 0;
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String query = "select Id from members where Id = ?";
try {
con = getConnection();
pstmt = con.prepareStatement(query);
pstmt.setString(1, Id);
rs = pstmt.executeQuery();
if (rs.next()) {
ri = MemberDAO.MEMBER_EXISTENT;
} else {
ri = MemberDAO.MEMBER_NONEXISTENT;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
rs.close();
pstmt.close();
con.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return ri;
}
// 로그인 시도시 아이디 비번 체크
public int userCheck (String id, String pw) {
int ri = 0;
String dbPw;
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String query = "select pw from members where id = ?";
try {
con = getConnection();
pstmt = con.prepareStatement(query);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
if (rs.next()) {
dbPw = rs.getString("pw");
if (dbPw.equals(pw)) {
ri = MemberDAO.MEMBER_LOGIN_SUCCESS; // 로그인 성공
} else {
ri = MemberDAO.MEMBER_LOGIN_PW_NO_GOOD; // 비밀번호 오류
}
} else {
ri = MemberDAO.MEMBER_LOGIN_IS_NOT; // 가입된 회원이 아님
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
rs.close();
pstmt.close();
con.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return ri;
}
// 회원정보를 DTO객체에 저장
public MemberDTO getMember(String id) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String query = "select * from members where id = ?";
MemberDTO dto = null;
try {
con = getConnection();
pstmt = con.prepareStatement(query);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
if (rs.next()) {
dto = new MemberDTO();
dto.setId(rs.getString("id"));
dto.setPw(rs.getString("pw"));
dto.setName(rs.getString("name"));
dto.seteMail(rs.getString("eMail"));
dto.setrDate(rs.getTimestamp("rDate"));
dto.setAddress(rs.getString("address"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
rs.close();
pstmt.close();
con.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return dto;
}
// 회원정보 수정
public int updateMember(MemberDTO dto) {
int ri = 0;
Connection con = null;
PreparedStatement pstmt = null;
String query = "update members set pw=?, eMail=?, address=? where id=?";
try {
con = getConnection();
pstmt = con.prepareStatement(query);
pstmt.setString(1, dto.getPw());
pstmt.setString(2, dto.geteMail());
pstmt.setString(3, dto.getAddress());
pstmt.setString(4, dto.getId());
ri = pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
pstmt.close();
con.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return ri;
}
// 연결 설정
private Connection getConnection() {
Context context = null;
DataSource dataSource = null;
Connection con = null;
try {
context = new InitialContext();
dataSource = (DataSource)context.lookup("java:comp/env/jdbc/Oracle11g");
con = dataSource.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
}
② MemberDTO.java
package com.javalec.memberDAO;
import java.sql.Timestamp;
public class MemberDTO {
private String id;
private String pw;
private String name;
private String eMail;
private Timestamp rDate;
private String address;
// public MemberDTO(String id, String pw, String name, String eMail, Timestamp rDate, String address) {
// this.id = id;
// this.pw = pw;
// this.name = name;
// this.eMail = eMail;
// this.rDate = rDate;
// this.address = address;
//
// }
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String geteMail() {
return eMail;
}
public void seteMail(String eMail) {
this.eMail = eMail;
}
public Timestamp getrDate() {
return rDate;
}
public void setrDate(Timestamp rDate) {
this.rDate = rDate;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
3) 로그인/로그아웃 기능
① login.jsp
- 로그인 폼 화면
- 이미 로그인 된 상태라면 메인화면으로 이동한다
- 회원가입 직후에는 세션에서 아이디를 불러와서 폼에 자동 입력하여 편의성을 더해준다
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% if(session.getAttribute("ValidMem") != null) { %> <!-- 이미 로그인된 상태면 메인화면으로 이동 -->
<jsp:forward page="main.jsp"></jsp:forward>
<% } %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 페이지</title>
</head>
<body>
<form action="loginOK.jsp" method="post"> <!-- 세션이 존재하면 세션의 아이디를 불러와서 출력 -->
아이디 : <input type="text" name="id" value="<% if(session.getAttribute("id") != null) out.println(session.getAttribute("id")); %>"><br />
비밀번호 : <input type="password" name="pw"><br />
<input type="submit" value="로그인"> <input type="button" value="회원가입" onclick="javascript:window.location='join.jsp'">
</form>
</body>
</html>

② loginOK.jsp
- DB에 저장된 회원정보와 입력받은 아이디/비밀번호 값을 비교하여 로그인 기능 처리
<%@page import="com.javalec.memberDAO.MemberDTO"%>
<%@page import="com.javalec.memberDAO.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 한글 인코딩
request.setCharacterEncoding("UTF-8");
// 넘어온 아이디와 비번 값 변수에 저장
String id = request.getParameter("id");
String pw = request.getParameter("pw");
// DAO 인스턴스 생성
MemberDAO dao = MemberDAO.getInstance();
int checkNum = dao.userCheck(id, pw);
// 체크 결과에 따라 안내 메세지 출력
if (checkNum == -1) {
%>
<script language="javascript">
alert("존재하지 않는 아이디입니다.")
history.go(-1);
</script>
<%
} else if(checkNum == 0) {
%>
<script language="javascript">
alert("비밀번호가 틀립니다.");
history.go(-1);
</script>
<%
} else if(checkNum == 1) {
MemberDTO dto = dao.getMember(id);
if(dto == null) {
%>
<script language="javascript">
alert("존재하지 않는 회원입니다.");
history.go(-1);
</script>
<%
} else { // 로그인 성공시 세션 값 설정
String name = dto.getName();
session.setAttribute("id", id);
session.setAttribute("name", name);
session.setAttribute("ValidMem", "yes");
response.sendRedirect("main.jsp");
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>

③ logout.jsp
- 로그아웃 버튼 클릭시 세션을 종료하고 로그인 페이지로 이동
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
session.invalidate(); /* 세션 종료 */
response.sendRedirect("login.jsp"); /* 세션 종료 후 login.jsp 페이지로 이동 */
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>

4) 회원가입 기능
① member.js
- 회원가입 및 정보수정시 입력값을 체크하는 함수를 가지고 있는 자바스크립트 파일
/**
*
*/
function infoConfirm() { // 회원가입시 입력한 정보 체크
// document는 현재페이지(join.jsp), reg_frm은 폼이름, id는 input이름, value는 입력받은 값, length로 공백 체크
if(document.reg_frm.id.value.length == 0) {
alert("아이디를 입력해주세요."); // 알림 팝업
reg_frm.id.focus(); // 해당 입력칸에 커서 위치시키기
return;
}
if(document.reg_frm.id.value.length < 4) {
alert("아이디는 4글자 이상이어야 합니다.");
reg_frm.id.focus();
return;
}
if(document.reg_frm.pw.value.length == 0) {
alert("비밀번호를 입력해주세요.");
reg_frm.pw.focus();
return;
}
if(document.reg_frm.pw.value != document.reg_frm.pw_check.value) {
alert("비밀번호가 일치하지 않습니다.");
reg_frm.pw_check.focus();
return;
}
if(document.reg_frm.name.value.length == 0) {
alert("이름을 입력해주세요.");
reg_frm.name.focus();
return;
}
if(document.reg_frm.eMail.value.length == 0) {
alert("메일을 입력해주세요.");
reg_frm.eMail.focus();
return;
}
if(document.reg_frm.address.value.length == 0) {
alert("주소를 입력해주세요.");
reg_frm.address.focus();
return;
}
document.reg_frm.submit(); // 모든 체크 메소드를 다 통과하면 최종적으로 submit
}
// 회원정보 수정시 입력한 정보 체크
function updateInfoConfirm() {
if(document.reg_frm.pw.value == "") { // document는 modify.jsp
alert("비밀번호를 입력하세요.");
document.reg_frm.pw.focus();
return;
}
if(document.reg_frm.pw.value != document.reg_frm.pw_check.value) {
alert("비밀번호가 일치하지 않습니다.");
document.reg_frm.pw_check.focus();
return;
}
if(document.reg_frm.eMail.value.length == 0) {
alert("메일을 입력해주세요.");
reg_frm.eMail.focus();
return;
}
if(document.reg_frm.address.value.length == 0) {
alert("주소를 입력해주세요.");
reg_frm.address.focus();
return;
}
document.reg_frm.submit();
}
② join.jsp
- 회원가입 입력 폼 페이지
- member.js 안에 있는 infoConfirm() 메소드를 통과한 경우에만 joinOK.jsp 파일로 전송한다
- 취소를 클릭하면 로그인 페이지로 돌아간다
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입 페이지</title>
<script language="JavaScript" src="members.js"></script> <!-- 자바스크립트 파일 지정 -->
</head>
<body> <!-- members.js파일 안에 있는 infoConfirm() 메소드를 통과해야 회원가입 완료 -->
<form action="joinOK.jsp" method="post" name="reg_frm">
아이디 : <input type="text" name="id" size="20"><br />
비밀번호 : <input type="password" name="pw" size="20"><br />
비밀번호 확인 : <input type="password" name="pw_check" size="20"><br />
이름 : <input type="text" name="name" size="20"><br />
메일 : <input type="text" name="eMail" size="20"><br />
주소 : <input type="text" name="address" size="50"><br />
<input type="button" value="회원가입" onclick="infoConfirm()"> <input type="reset" value="취소" onclick="javascript:window.location='login.jsp'">
</form>
</body>
</html>

③ joinOK.jsp
- 회원가입 시도 결과를 처리한다
- 결과에 따라 회원가입 입력 폼 페이지로 돌아가거나 로그인 페이지로 이동한다
<%@page import="com.javalec.memberDAO.*"%>
<%@page import="java.sql.Timestamp"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %> <!-- 한글 인코딩 -->
<jsp:useBean id="dto" class="com.javalec.memberDAO.MemberDTO" /> <!-- 액션태그로 자바 빈 사용 -->
<jsp:setProperty name="dto" property="*" />
<!-- form의 각 input태그의 name속성과 bean(DTO)의 getter&setter의 이름이 일치하면 *를 사용하여 form에서 입력한 내용을 자동채우기 할 수 있다 -->
<!-- 그렇지 않으면 모든 값을 다 수동으로 넣어주어야 한다 -->
<%
dto.setrDate(new Timestamp(System.currentTimeMillis()));
MemberDAO dao = MemberDAO.getInstance();
if(dao.confirmId(dto.getId()) == MemberDAO.MEMBER_EXISTENT) {
%>
<script language="javascript">
alert("이미 존재하는 아이디입니다.");
history.back();
</script>
<%
} else {
int ri = dao.insertMember(dto);
if (ri == MemberDAO.MEMBER_JOIN_SUCCESS) {
session.setAttribute("id", dto.getId());
%>
<script language="javascript">
alert("회원가입을 축하합니다!")
document.location.href="login.jsp";
</script>
<%
} else {
%>
<script language="javascript">
alert("회원가입에 실패했습니다.");
document.location.href="login.jsp";
</script>
<%
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>


5) 회원정보 수정 기능
① modify.jsp
- 세션에서 로그인 중인 사용자 정보를 가져와 폼에 자동입력해준다
- 아이디와 이름은 수정할 수 없다
- 비밀번호도 변경이 가능하다
- member.js 파일에 있는 updateInfoConfirm() 메소드를 통과한 경우에만 modifyOK.jsp 파일로 전송한다
<%@page import="com.javalec.memberDAO.MemberDTO"%>
<%@page import="com.javalec.memberDAO.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %>
<% /* 세션에서 현재 로그인 중인 사용자 정보 가져오기 */
String id = (String)session.getAttribute("id");
MemberDAO dao = MemberDAO.getInstance();
MemberDTO dto = dao.getMember(id);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원정보 수정 페이지</title>
<script language="JavaScript" src="members.js"></script> <!-- 자바스크립트 파일 -->
</head>
<body>
<!-- 회원정보 수정폼 -->
<form action="modifyOK.jsp" method="post" name="reg_frm">
아이디 : <%= dto.getId() %><br />
비밀번호 : <input type="password" name="pw" size="20"><br />
비밀번호 확인 : <input type="password" name="pw_check" size="20"><br />
이름 : <%= dto.getName() %><br />
메일 : <input type="text" name="eMail" size="20" value="<%= dto.geteMail() %>"><br />
주소 : <input type="text" name="address" size="50" value="<%= dto.getAddress() %>"><br />
<input type="button" value="수정" onclick="updateInfoConfirm()"> <input type="reset" value="취소" onclick="javascript:window.location='login.jsp'">
</form>
</body>
</html>

② modifyOK.jsp
- 정보 수정 성공시 메인 페이지로 이동한다
- 정보 수정 실패시 정보 수정 페이지로 돌아간다
<%@page import="com.javalec.memberDAO.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %>
<jsp:useBean id="dto" class="com.javalec.memberDAO.MemberDTO" scope="page" />
<jsp:setProperty property="*" name="dto"/>
<%
String id = (String)session.getAttribute("id");
dto.setId(id);
MemberDAO dao = MemberDAO.getInstance();
int ri = dao.updateMember(dto);
if(ri == 1) {
%>
<script language="javascript">
alert("회원정보가 수정되었습니다.");
document.location.href="main.jsp";
</script>
<%
} else {
%>
<script language="javascript">
alert("회원정보 수정에 실패했습니다.");
history.go(-1);
</script>
<%
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>

'강의 정리 > JSP & Servlet (Seoul Wiz)' 카테고리의 다른 글
20. 커넥션 풀 (0) | 2019.08.19 |
---|---|
19. Oracle 데이버 베이스 (3) (0) | 2019.08.14 |
18. Oracle 데이터 베이스 2 (0) | 2019.08.14 |
17. Oracle 데이터 베이스 1 (0) | 2019.08.14 |
16. JAVA Bean (0) | 2019.08.14 |