본문 바로가기

WEB

[WEB]VO 패턴 (VO Pattern)

728x90

VO(Value Object)는 값 객체의 의미를 가진 클래스를 말한다.

 

메소드에 매개변수가 많으면 프로그램의 유지보수를 어렵게 만든다.

 

앞서 DAO 패턴을 이용할 때 0~3개의 매개변수를 이용한 로직들을 구현하였지만

 

규모가 큰 프로젝트일수록 많은 매개변수를 사용할 수 밖에 없다. (주고받는 데이터가 많을 수 밖에 없기 때문에)

 

그래서 이를 보완하기 위해 VO 패턴이 생겨났다.

 

 

DAO 패턴 (DAO Pattern)

DAO(Data Access Object) DAO 패턴은 비즈니스 로직과 DB를 분리하기 위해 사용하는 패턴이다. 앞선 JDBC를 사용하면 DB의 전환이 쉽다는 장점이 있었다. 그러나 JDBC 프로그램의 절차가 너무 장황하고 복잡

yoohwanihn.tistory.com

 

VO 패턴이 적용된 클래스를 이용하면 관련된 여러 값을 하나의 객체에 담아서 처리할 수 있다.

 

UserVO를 만들어보자.

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
package com.test.user;
 
public class UserVO {
    // private 멤버 변수 선언
    private String id;
    private String password;
    private String name;
    private String role;
    
    // Getter/Setter 메소드
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getRole() {
        return role;
    }
    public void setRole(String role) {
        this.role = role;
    }
    
}
 
cs

 

변수를 private로 만들어 준 뒤

 

Getter, Setter 메소드를 통해 캡슐화, 은닉화의 장점을 활용할 수 있다.

 

롬복을 이용해 Getter나 Setter 어노테이션을 사용하여 메소드를 만들지 않고 활용할 수 있는 환경도 존재하지만

 

아직 현업에서 롬복을 쓰지 않는 회사도 많은 것 같다. (적어도 나는 그럼...)

 

그럼 만들어둔 VO를 바탕으로 CRUD를 수행하기 위해

 

먼저 UserDAO2를 만들어서 비교해보자.

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 UserDAO2 {
    // 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(UserVO vo) {
        try {
            conn = JDBCUtil.getConnection();
            stmt = conn.prepareStatement(USER_INSERT);
            stmt.setString(1, vo.getId());
            stmt.setString(2, vo.getPassword());
            stmt.setString(3, vo.getName());
            stmt.setString(4, vo.getRole());
            stmt.executeUpdate();
        } catch(SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.close(stmt, conn);
        }
    }
    
    //회원 수정 (UPDATE)
    public void updateUser(UserVO vo) {
        try {
            conn = JDBCUtil.getConnection();
            stmt = conn.prepareStatement(USER_UPDATE);
            stmt.setString(1, vo.getName());
            stmt.setString(2, vo.getRole());
            stmt.setString(3, vo.getId());
            stmt.executeUpdate();
        } catch(SQLException e) {
            e.printStackTrace();
        }
        finally {
            JDBCUtil.close(stmt, conn);
        }
    }
    
    //회원 삭제 (DELETE)
    public void deleteUser(UserVO vo) {
        try {
            conn = JDBCUtil.getConnection();
            stmt = conn.prepareStatement(USER_DELETE);
            stmt.setString(1, vo.getId());
            stmt.executeUpdate();
        } catch(SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.close(stmt, conn);
        }
    }
 
}
 
cs

매개변수가 없었던 getUserList를 제외한 나머지 메소드 들을

 

id, role, name각각 받아오던 것에서 VO객체를 받아와 Getter 메소드를 이용해 값을 할당하는 식으로 변경 했다.

 

getUserList() 메소드만 조금 더 수정해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* USERS 테이블 관련 CRUD 메소드 */
    // 회원 목록 조회 (SELECT)
    public List<UserVO> getUserList() {
        List<UserVO> userList = new ArrayList<UserVO>();
        try {
            conn = JDBCUtil.getConnection();
            stmt = conn.prepareStatement(USER_LIST);
            rs = stmt.executeQuery();
            while(rs.next()) {
                UserVO user = new UserVO();
                user.setId(rs.getString("ID"));
                user.setPassword(rs.getString("PASSWORD"));
                user.setName(rs.getString("NAME"));
                user.setRole(rs.getString("ROLE"));
                userList.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.close(rs, stmt, conn);
        }
        return userList;
    }
cs

리스트 컬렉션을 이용하여 제네릭으로 UserVO로 타입을 제한한 뒤 데이터를 넘겨주는 방식이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.List;
 
import com.test.user.UserDAO2;
import com.test.user.UserVO;
 
public class SelectUserTest3 {
    public static void main(String[] args) {
        // 1. UserDAO 객체를 생성한다.
        UserDAO2 dao2 = new UserDAO2();
        
        // 2. 목록을 조회한다.
        List<UserVO> userList = dao2.getUserList();
        
        System.out.println("전체 회원의 수 : " + userList.size());
        System.out.println("[ 회원의 이름 ]");
        for(UserVO user : userList) {
            System.out.println(user.getName());
        }
    }
 
}
 
cs

그러면 다음과 같이 회원의 목록을 조회할 수 있게 된다.

 

 

 

 

 

이렇듯 VO는 여러 개의 매개변수를 사용하는 메소드에 대해서 매개변수를 하나로 통합하는 역할을 하고, 

 

코드의 가독성과 간결화를 향상시켜 유지보수에 용이하게 해준다.

 

 

'WEB' 카테고리의 다른 글

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