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

예제5. 인터페이스의 도입

by 막이 2014. 8. 20.

인터페이스로 추상화해놓은 최소한의 통로를 통해 접근하는 쪽에서는 오브젝트를 만들 때 사용할 클래스가 무엇인지 몰라도 된다. 인터페이스를 통해 접근하게 하면 실제 구현 클래스를 바꿔도 신경쓸 일이 없다.


DConnection 클래스 생성자를 호출해서 오브젝트를 생성하는 코드가 여전히 UserDao에 남아있다.

UserDao와 UserDao가 사용할 ConnectionMaker의 특정 구현 클래스 사이의 관계를 설정해주는 것에 대한 관심사를 담은 코드를 UserDao에서 분리하지 않으면 UserDao는 결코 독립적으로 확장 가능한 클래스가 될 수 없음.


ConnectinMaker.java

1
2
3
4
5
6
7
8
9
10
11
package springbook.user.dao;
 
import java.sql.Connection;
import java.sql.SQLException;
 
public interface ConnectionMaker {
    
    public Connection makeConnection() throws ClassNotFoundException, SQLException;
 
}
 


DConnectionMaker.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 DConnectionMaker implements ConnectionMaker {
 
    public Connection makeConnection() throws ClassNotFoundException,
            SQLException {
        
        //D 사의 독자적인 방법으로 Connection을 생성하는 코드
        return null;
    }
 
}
 


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
62
63
64
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  class UserDao {
 
    // 인터페이스를 통해 오브젝트에 접근하므로 구체적인 클래스 정보를 알 필요가 없다 
    private ConnectionMaker connectinMaker;
    
    public UserDao(){
        //클래스 이름 등장
        connectinMaker = new DConnectionMaker();
    
    }
    
    public void add(User user) throws ClassNotFoundException, SQLException{
        //인터페이스에 정의된 메소드를 사용하므로 클래스가 바뀐다고 해도 메소드 이름이 변경될 걱정은 없다
        Connection c = connectinMaker.makeConnection();
        
        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{
        Connection c =connectinMaker.makeConnection();
        
        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;
        
    }
    
}
 
 


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

예제7. 팩토리  (0) 2014.08.20
예제6. 관심사의 분리  (0) 2014.08.20
예제4. 클래스의 분리  (0) 2014.08.20
예제3. 상속을 통한 확장  (0) 2014.08.20
예제2 중복 코드의 메소드 추출  (0) 2014.08.18