상세 컨텐츠

본문 제목

DAO, DTO, PreparedStatement, DBCP를 이용한 간단한 회원인증

WebProgramming/JSP

by ChrisMare 2018. 10. 25. 15:04

본문

DAO ?

Data Access Object의 약어로 서버에서 DB로 접근하여 관리하는 객체이다. (즉, DB관련 기능을 구현하는 곳이다.)


데이터 베이스에 접속하여 데이터 추가, 삭제, 수정 등의 작업을 하는 클래스.

일반적인 JSP 혹은 Servlet 페이지내에 위의 로직을 함께 기술할 수 도 있지만, 

유지보수 및 코드의 모듈화를 위해서 별도의 DAO 클래스를 만들어서 사용한다.

DTO ?

Data Transfer Object의 약어로 DB와 관련된 데이터를 관리하는 클래스이다.

DAO 클래스를 이용하여 데이터 베이스에서 데이터를 관리할 때 데이터를 일반적인 변수에 할당하여 작업할 수도 있지만,
해당 데이터의 클래스를 만들어 사용한다.

PreparedStatement ?

SQL문 실행을 위해 Statement 객체를 이용할 수 있지만 이것은 중복코드가 많아지는 단점이 있다.
이러한 단점을 보완하기 위해서 나온것이 PreparedStatement 객체이다.
이 객체는 코드의 가독성을 떨어뜨리는 난잡한 코드를 간결하게 해결하는 방법이 된다.
ex)

1
2
3
4
5
6
7
8
9
10
11
12
Class.forName(driver);
connection = DriverManager.getConnection(url, uid, upw);
int n;
String query = "insert into member values (?, ?, ?, ?, ?)";
preparedStatement = connection.preparedStatement(query);
 
preparedStatement.setString(1, "id");
preparedStatement.setString(2, "pw");
preparedStatement.setString(3, "name");
preparedStatement.setString(4, "sex");
preparedStatement.setString(5, age);
n =  preparedStatement.executeUpdate();
cs

이전에는 query에 다 적었지만 '?' 를 줘서 query문을 미리전송하고 후에 setting을 해주는 기능이다.

이를 통해서 가독성을 높일 수 있다.

커넥션 풀(DBCP) ?

클라이언트에서 다수의 요청이 발생할 경우 데이터베이스에 부하가 발생하게 된다.
이러한 문제를 해결 하기 위해서는 커넥션 풀(DataBase Connection Pool) 기법을 이용한다.

클라이언트에서 다수의 요청이 발생할 경우 Connection 객체가 생성되는데 이 객체는 DB에 많은 부하를 준다.
따라서 이 부하를 줄이기 위해 버퍼에 미리 Connection 객체를 여러개 만들어 놓고 사용자가 미리 만들어진 Connection 객체를 이용하게 하는 기법이다.
즉, 서버에서 미리 DB에 접속하여 Connection 객체를 여러개 만들어놓고 이것을 사용하여 DB와 통신하는 것이다.

사용방법

tomcat과 같은 서버 컨테이너가 데이터베이스 인증을 하도록 context.xml 파일을 열어 사용자 db 정보를 기록한다.
이곳에 만드는 이유는 DBCP는 JAVA에 없고 SERVER안에 미리 만들라고 지시를 하고 있기 때문이다.

커넥션 풀(DBCP)을 만들기 위해서는 사전 작업이 필요하다.

1. Server에 있는 context.xml 파일에 Container에 해당 소스 추가

1
2
3
4
5
6
7
8
9
10
11
<Resource
    auth="Container"
    driverClassName="oracle.jdbc.driver.OracleDriver"
    url="jdbc:oracle:thin:@localhost:1521:xe"
    username="scott"
    password="1234"
    name="jdbc/Oracle11g"
    type="javax.sql.DataSource"
    maxActive="50"
    maxWait="1000" 
/>
cs

name -> 오라클 이름
maxActive -> 미리 몇 개의 Connection 객체를 만들지 정하는 것이다.
maxWait -> 위에서 만들 객체를 초과한 요청일 시 1000을 기다려야 된다는 의미이다.

2. context.xml파일 추가 후 프로젝트 속 server의 .xml과 톰캣 server의 xml의 싱크를 맞춰줘야된다.
Pulish to server...

여기까지가 커넥션 풀에 있는 드라이버 로드를 사전 설정 했기 때문에 바로 가져다가 사용가능해진다.
--> DB연결가 간단해져 코드를 줄 일 수 있다.

3. 이제부터 다음 코드만 사용하면 가능해진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
 
Context context = null;
DataSource dataSource = null;
Connection connection = null;
 
try {
        context = new InitialContext();
        dataSource = (DataSource)context.lookup("java:comp/env/jdbc/Oracle11g");
        connection = dataSource.getConnection();
catch (Exception e) {
    e.printStackTrace();
}
cs

login.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<% request.setCharacterEncoding("EUC-KR"); %>
<%
    if(session.getAttribute("vaildMember"!= null){%>
        <jsp:forward page="main.jsp"/>
<%}%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Login</title>
</head>
<body>
    <h1>Login Page</h1>
    <hr>
    <form action="loginOK.jsp" method="post">
        아이디 : <input type="text" name="id"
            value="<%if (session.getAttribute("id") != null) out.print(session.getAttribute("id"));%>" size="10"><br /
            비밀번호 : <input type="password" name="pw" size="10"><br />
            <input type="submit" value="로그인">&nbsp;
            <input type="button" value="회원가입" onclick="window.location='join.jsp' ">
    </form>
</body>
</html>
cs

loginOK.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<%@page import="com.dbcplec.ex.MemberDTO"%>
<%@page import="com.dbcplec.ex.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%
    request.setCharacterEncoding("EUC-KR");
 
    String id = request.getParameter("id");
    String pw = request.getParameter("pw");
 
    //싱글톤으로 dao객체를 생성한다.
    MemberDAO dao = MemberDAO.getInstance();
    
    int loginCheck = dao.loginCheck(id, pw);
    if(loginCheck == -1){
%>
    <script>
        alert("아이디가 존재하지 않습니다.");
        history.go(-1);
    </script>
<%
    }else if(loginCheck == 0){
%>
        <script>
            alert("비밀번호가 틀렸습니다.");
            history.go(-1);
        </script>
<%        
    }else if(loginCheck == 1){
        MemberDTO dto = dao.getMember(id);
        
        if(dto == null){
%>
            <script>
                alert("존재하지 않은 회원 입니다.");
                history.go(-1);
            </script>
<%    
        }else{
            session.setAttribute("id", id);
            session.setAttribute("name", dto.getName());
            session.setAttribute("ValidMem""yes");
            response.sendRedirect("main.jsp");
        }
    }
    
    
%>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Login Check Result</title>
</head>
<body>
    <h1>Login Check Result</h1>
    <hr>
</body>
</html>
cs

join.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Join Page</title>
</head>
<body>
<h1>Join</h1>
<hr>
<form action="joinOK.jsp" method="post">
    아이디 : <input type="text" name="id" size="20"><br/>
    비밀번호 : <input type="password" name="pw" size="20"><br/>
    이름 : <input type="text" name="name" size="20"><br/>
    이메일 : <input type="email" name="email" size="20"><br/>
    주소 : <input type="text" name="address" size="20"><br/><br/>
    <input type="submit" value="회원가입"> &nbsp;&nbsp;
    <input type="button" value="취소" onclick="window.location='login.jsp' ">
</form>
</body>
</html>
cs

joinOK.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<%@page import="com.dbcplec.ex.MemberDAO"%>
<%@page import="java.sql.Timestamp"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<% request.setCharacterEncoding("EUC-KR"); %>
<jsp:useBean id="dto" class="com.dbcplec.ex.MemberDTO"/>
<jsp:setProperty property="*" name="dto"/<!-- dto의 모든 프로퍼티(*)을 넣겠다. -->
<%
    dto.setmDate(new Timestamp(System.currentTimeMillis()));
    //--- 여기 까지 데이터를 set하는 과정
    MemberDAO dao = MemberDAO.getInstance();
    if(dao.confirmId(dto.getId()) == MemberDAO.MEMBER_EXISTENT){
%>
<script language="javascript">
alert("아이디가 존재합니다.");
history.back();
</script>
<%
    }else{
        int result = dao.insertMember(dto);
        if( result == MemberDAO.MEMBER_JOIN_SUCCESS){
            session.setAttribute("id", dto.getId());
%>
    <script language="javascript">
        alert("회원가입 성공!!");
        document.location.href="login.jsp";
    </script>
<%            
        }else{
%>
            <script>
                alert("회원가입 실패!!");
                document.location.href="login.jsp";
            </script>
<%        
        }
    }
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Join Check Page</title>
</head>
<body>
<h1>Join Check Result</h1>
<hr>
 
</body>
</html>
cs

main.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<% if(session.getAttribute("ValidMem"== null){
%>
    <jsp:forward page="login.jsp"/>
<%
    }
    
    String name = (String)session.getAttribute("name");
    String id = (String)session.getAttribute("id");
%>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Member MainPage</title>
</head>
<body>
<h1>Member Main Page</h1>
<hr>
<h2><%= name %>님 안녕하세요.</h2>
<form action="logout.jsp" method="post">
    <input type="submit" value="로그아웃">&nbsp;&nbsp;
    <input type="button" value="정보수정" onclick="window.location='modify.jsp' ">
</form>
</body>
</html>
cs

modify.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<%@page import="com.dbcplec.ex.MemberDTO"%>
<%@page import="com.dbcplec.ex.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%
    request.setCharacterEncoding("EUC-KR");
 
    String id = (String)session.getAttribute("id");
    MemberDAO dao = MemberDAO.getInstance();
    MemberDTO dto = dao.getMember(id);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Member Modify Page</title>
</head>
<body>
<h1>Member Modify Page</h1>
<hr>
<form action="modifyOK.jsp" method="post">
    아이디 : <%= dto.getId() %><br/>
    비밀번호 : <input type="password" name="pw" size="20"><br/>
    이름 : <%=dto.getName() %><br/>
    이메일 : <input type="email" name="email" size="20" value="<%=dto.getEmail() %>"><br/>
    주소 : <input type="text" name="address" size="20" value="<%=dto.getAddress() %>"><br/><br/>
    <input type="submit" value="수정"> &nbsp;&nbsp;
    <input type="button" value="취소" onclick=" history.go(-1) ">
</form>
</body>
</html>
cs

modifyOK.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<%@page import="com.dbcplec.ex.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<% request.setCharacterEncoding("EUC-KR"); %>
 
<jsp:useBean id="dto" class="com.dbcplec.ex.MemberDTO"/>
<jsp:setProperty property="*" name="dto"/>
 
<%
    String id = (String)session.getAttribute("id");
    dto.setId(id);
    
    MemberDAO dao = MemberDAO.getInstance();
    int result = dao.modifyMember(dto);
    
    if(result == 1){
%>
        <script>
            alert("회원정보가 수정되었습니다.");
            document.location.href="main.jsp";
        </script>        
<%
    }else{
%>
        <script>
            alert("회원정보 수정에 실패하였습니다.");
            history.go(-1);
        </script>        
<%        
    }
%>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
 
</body>
</html>
cs

logout.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%
    session.invalidate();
    response.sendRedirect("login.jsp");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
 
</body>
</html>
cs


감사합니다...

관련글 더보기

댓글 영역