본문 바로가기
Programming/토비의 스프링 예제

예제3. 상속을 통한 확장

by 막이 2014. 8. 20.

템플릿 메소드 패턴 : 슈퍼클래스에 기본적인 로직의 흐름(커넥션, SQL생성, 실행, 반환) 을 만들고, 그 기능의 일부를 추상 메소드나 오버라이딩이 가능한 protected 메소드 등으로 만든 뒤 서브클래스에서 이런 메소드를 필요에 맞게 구현해서 사용하도록 하는 방법


팩토리 메소드 패턴 : 서브클래서에 구체적인 오브젝트  생성 방법을 결정하게 하는 것

NUserDao, DUserDao 에서는 어떤식으로 Connection 기능을 제공하는지, 어떤 방법으로 Connection 오브젝트를 만들어내는지에 대한 관심을 가지고 있음.


상속을 통한 확장방법이 제공
UserDAO.java
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
package springbook.user.dao;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
import springbook.user.domain.User;
 
public abstract class UserDao {
    
    public void add(User user) throws ClassNotFoundException, SQLException{
        //DB 연결 기능이 필요하면 getConnection() 메소드를 이용하게 된다.
        Connection c = getConnection();
        
        PreparedStatement ps = c.prepareStatement(
            "INSERT INTO USERS(id, name, password)"
                +"VALUES( ?,?,?)"
        );
        
        ps.setString(1, user.getId());
        ps.setString(2, user.getName());
        ps.setString(3, user.getPassword());
        
        ps.executeUpdate();
        
        ps.close();
        c.close();
    }
    
    public User get(String id) throws ClassNotFoundException, SQLException{
        //DB 연결 기능이 필요하면 getConnection() 메소드를 이용하게 된다.
        Connection c = getConnection();
        
        PreparedStatement ps = c.prepareStatement("SELECT * FROM USERS WHERE id = ?");
        ps.setString(1, id);
        
        ResultSet rs = ps.executeQuery();
        rs.next();
        
        User user = new User();
        user.setId(rs.getString("id"));
        user.setName(rs.getString("name"));
        user.setPassword(rs.getString("password"));
        
        rs.close();
        ps.close();
        c.close();
        
        return user;
        
    }
    
    
    /*
     * 구현 코드는 제거 되고 추상메소드로 바뀌었음. 메소드의 구현은 서브 클래스가 담당
     */
    public abstract Connection getConnection() throws ClassNotFoundException, SQLException ;
}
 




DUserDao.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package springbook.user.dao;
 
import java.sql.Connection;
import java.sql.SQLException;
 
public class DUserDao extends UserDao{
 
    @Override
    public Connection getConnection() throws ClassNotFoundException,
            SQLException {
        // D사 DB Connection 생성코드
        return null;
    }
 
}
 



NUserDao.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package springbook.user.dao;
 
import java.sql.Connection;
import java.sql.SQLException;
 
public class NUserDao extends UserDao{
 
    @Override
    public Connection getConnection() throws ClassNotFoundException,
            SQLException {
        // N사 DB Connection 생성코드
        return null;
    }
 
}
 


'Programming > 토비의 스프링 예제' 카테고리의 다른 글

예제6. 관심사의 분리  (0) 2014.08.20
예제5. 인터페이스의 도입  (0) 2014.08.20
예제4. 클래스의 분리  (0) 2014.08.20
예제2 중복 코드의 메소드 추출  (0) 2014.08.18
예제1  (0) 2014.08.18