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

예제4. 클래스의 분리

by 막이 2014. 8. 20.

상속관계도 아닌 완전히 독립적인 클래스로 만든다.

SimpleConnectionMaker 라는 새로운 클래스를 만들고 DB생성 기능을 그 안에 넣음. 한번만 SImpleConnectionMaker 오브젝트를

만들어서 저장해두고 이를 계속 사용.

문제점1. 메소드 이름이 바꼈을 경우

문제점2. DB커넥션을 제공하는 클래스가 어떤 것인지를 UserDao가 구체적으로 알고 있어야한다. UserDao가 SImpleConnectinMaker라는 특정 클래스와 그 코드에 종속적이기 때문에 DB커넥션을 가져오는 방법을 자유롭게 확장하기가 힘들어짐.


SImpleConnectionMaker.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.DriverManager;
import java.sql.SQLException;
 
public class SimpleConnectionMaker {
    public Connection makeNewConnection() throws ClassNotFoundException, SQLException{
        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection c = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testDB" , "otep""otep");
        
        return c;
    }
 
}
 


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
65
66
67
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 SimpleConnectionMaker simpleConnectionMaker;
    
    public UserDao(){
        //한번만 인스턴스 변수에 저장해두고 메소드에서 사용하게 한다.
        simpleConnectionMaker = new SimpleConnectionMaker();
    
    }
    
    public void add(User user) throws ClassNotFoundException, SQLException{
        Connection c = simpleConnectionMaker.makeNewConnection();
        
        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 = simpleConnectionMaker.makeNewConnection();
        
        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 ;
}
 


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

예제6. 관심사의 분리  (0) 2014.08.20
예제5. 인터페이스의 도입  (0) 2014.08.20
예제3. 상속을 통한 확장  (0) 2014.08.20
예제2 중복 코드의 메소드 추출  (0) 2014.08.18
예제1  (0) 2014.08.18