DAO 확장
- 앞선 추상 클래스를 이용 한 것은 여러 모듈을 다양하게 사용하기 위함
- 하지만 상속이라는 큰 단점을 안고 있다.
클래스의 분리
- 상속 문제를 해결하기 위해 완전히 독립된 클래스로 만든다.
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.prepareStatment("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 class SimpleConnectionMaker {
public Connection makeNewConnection() throws ClassNotFoundException,SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection("jdbc:mysql://localhost/DBname","ID","PW");
return c;
}
}
- 문제점
- 분리는 성공했지만, UserDao의 코드가 SimpleConnectionMaker라는 특정 클래스에 종속되어있기 때문에 상속을 사용했을 때 처럼 UserDao 코드의 수정 없이 DB커넥션 생성 기능 변경할 방법이 없다.
- DB 커넥션을 제공하는 클래스가 어떤 것인지를 UserDao가 구체적으로 알고 있어야 한다.