1. 관심사의 분리

2. 관심사 나눠보기

  1. DB 연결 관련 관심사
  2. 파라미터 바인딩과 DB 종류 관련 관심사
  3. statement와 connection 닫는 관심사
  4. 필요한 Connection 구현체와 연결해주는 관심사

3. 코드 리펙토링하기

※ 이처럼 중복되는 코드를 추출하는 리펙토링을 메소드 추출이라고 한다.

private Connection getConnection() throws ClassNotFoundException, SQLException{
    Class.forName("com.mysql.cj.jdbc.Driver");
    Connection c = DriverManager.getConnection("jdbc:mysql://localhost/toby-part1","root","1234");
    return c;
}

public void add(User user) throws ClassNotFoundException, SQLException{
    Connection c = getConnection();
    PreparedStatement ps = c.prepareStatement("insert into user(id, Name, Password) values(?,?,?)");
    ps.setString(1, user.getId()); // id = user.getId
    ps.setString(2, user.getName()); // Name = user.getName
    ps.setString(3, user.getPassword()); // Password = user.getPassword
    ps.executeUpdate(); // update 완료
    ps.close(); // PreparedStatement 닫기
    c.close(); // connection 닫기
}

4. DB 커넥션 확장 (클래스 상속을 활용한 디자인 패턴)

상속을 활용한 확장

public class UserDao{
	//적절한 코드
	protected Connection getConnection() throws ClassNotFoundException, SQLException;
}

public class DUserDao extends UserDao{
	public Connection getConnection() throws ClassNotFoundException, SQLException{
		// 적절한 코드 생성
	}
}