본문 바로가기

WEB

[WEB]DAO 패턴 (DAO Pattern)

728x90

DAO(Data Access Object)

 

DAO 패턴은 비즈니스 로직과 DB를 분리하기 위해 사용하는 패턴이다.

 

앞선 JDBC를 사용하면 DB의 전환이 쉽다는 장점이 있었다.

 

그러나 JDBC 프로그램의 절차가 너무 장황하고 복잡해서 비즈니스 로직이나 알고리즘에 집중하기 어렵다는 단점이 존재한다.

 

그래서 이를 개선하여 DB를 사용하는 방법이 변경되더라도 클라이언트측의 로직이 변경되지 않도록 DB로직을 캡슐화 하여 분리하는 방법을 만들었는데 이를 DAO 패턴이라 한다.

 

 

JDBC

JDBC(Java DataBase Connectivity)는 자바 프로그램에서 관계형 데이터베이스를 연동하기 위해 제공하는 표준 API이다. java.sql 패키지로 지원하며 JDBC(java.sql) API를 이용하면 DBMS에 종속되지 않고 프로그램

yoohwanihn.tistory.com

 

 

 

기존의 DAO패턴을 사용하기 전, JDBCUtil만을 만들어둔 경우에는 다음과 같이 조회해야 한다.

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
public class SelectUserTest1 {
    public static void main(String[] args) {
        // JDBC 관련 변수
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
 
        try {
            conn = JDBCUtil.getConnection();
 
            /* JDBC 3단계 : Statement 생성 */
            // 일반 statement는 sql injection 대처가 어려워 PreparedStatement를 사용함. values 암호화.
            String sql = "SELECT * FROM users";
            stmt = conn.prepareStatement(sql);
 
            /* JDBC 4단계 : SQL 전송 */
            rs=stmt.executeQuery();
 
            System.out.println("[USER 목록]");
            rs.next();
            System.out.print(rs.getString("ID"+ " : ");
            System.out.print(rs.getString("PASSWORD"+ " : ");
            System.out.print(rs.getString("NAME"+ " : ");
            System.out.println(rs.getString("ROLE"));
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.close(rs, stmt, conn);
        }
    }
}
 
cs

 

코드 재사용적인 측면에서도 불편하며, 해당 기능을 수행할 때마다 클래스를 만들어줘야 한다.

 

 

 

 

DAO로 만들어보자

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package com.test.user;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
import com.test.common.JDBCUtil;
 
public class UserDAO {
    // JDBC 관련 변수
    private Connection conn = null;
    private PreparedStatement stmt = null;
    private ResultSet rs = null;
    
    // USERS 테이블 관련 SQL 명령어
    private String USER_LIST = "select * from users";
    private String USER_INSERT = "insert into users values(?, ?, ?, ?)";
    private String USER_UPDATE = "update users set name = ?, role = ? where id = ?";
    private String USER_DELETE = "delete users where id = ?";
    
    /* USERS 테이블 관련 CRUD 메소드 */
    // 회원 목록 조회 (SELECT)
    public void getUserList() {
        try {
            conn = JDBCUtil.getConnection();
            stmt = conn.prepareStatement(USER_LIST);
            rs = stmt.executeQuery();
            System.out.println("[USER 목록]");
            while(rs.next()) {
                System.out.print(rs.getString("ID"+ " : ");
                System.out.print(rs.getString("PASSWORD"+ " : ");
                System.out.print(rs.getString("NAME"+ " : ");
                System.out.print(rs.getString("ROLE"+ " : ");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.close(rs, stmt, conn);
        }
    }
    
    //회원 등룍 (INSERT)
    public void insertUser(String id, String pw, String name, String role) {
        try {
            conn = JDBCUtil.getConnection();
            stmt = conn.prepareStatement(USER_INSERT);
            stmt.setString(1, id);
            stmt.setString(2, pw);
            stmt.setString(3, name);
            stmt.setString(4, role);
            stmt.executeUpdate();
        } catch(SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.close(stmt, conn);
        }
    }
    
    //회원 수정 (UPDATE)
    public void updateUser(String name, String role, String id) {
        try {
            conn = JDBCUtil.getConnection();
            stmt = conn.prepareStatement(USER_UPDATE);
            stmt.setString(1, name);
            stmt.setString(2, role);
            stmt.setString(3, id);
            stmt.executeUpdate();
        } catch(SQLException e) {
            e.printStackTrace();
        }
        finally {
            JDBCUtil.close(stmt, conn);
        }
    }
    
    //회원 삭제 (DELETE)
    public void deleteUser(String id) {
        try {
            conn = JDBCUtil.getConnection();
            stmt = conn.prepareStatement(USER_DELETE);
            stmt.setString(1, id);
            stmt.executeUpdate();
        } catch(SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.close(stmt, conn);
        }
    }
 
}
 
cs

 

 

 

그러면 이 DAO를 이용해서 회원 목록을 조회하는 방법은 훨씬 간단해진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.test.user;
 
public class SelectUserTest2 {
 
    public static void main(String[] args) {
        // 1. UserDAO 객체 생성
        UserDAO dao = new UserDAO();
        
        // 2. 목록을 조회
        dao.getUserList();
    }
 
}
 
cs

 

 

INSERT 역시 마찬가지다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.test.user.dao;
 
import com.test.user.UserDAO;
 
public class InsertUserTest2 {
    public static void main(String[] args) {
        // 1. UserDAO 객체를 생성한다.
        UserDAO dao = new UserDAO();
        
        // 2. 회원 정보를 등록한다.
        dao.insertUser("아디""비번""이름""권한");
        
        // 3. 목록을 조회한다.
        dao.getUserList();
    }
}
 
cs

 

'WEB' 카테고리의 다른 글

[WEB]Redirect와 Forward의 차이  (0) 2024.02.15
이클립스 톰캣 resource '/server' does not exist 에러 해결 방법  (0) 2024.02.15
[WEB]VO 패턴 (VO Pattern)  (0) 2024.02.14
[WEB]JDBC  (0) 2024.02.14
JSON과 XML  (0) 2024.02.14