SSAFY11th-book-study / book-study

SSAFY 11기 6반의 '토비의 스프링 스터디'
0 stars 0 forks source link

[1.2.3] DB 커넥션 만들기의 독립 #5

Closed sootudio closed 8 months ago

sootudio commented 9 months ago

72p ~ 73p에서 상속을 사용한 방법의 단점을 설명하며, 73페이지에 '확장된 기능인 DB 커넥션을 생성하는 코드를 다른 DAO 클래스에 적용할 수 없다는 것도 단점이다' 라는 부분이 이해가 가지 않습니다.

만약 User에 대한 DAO가 아닌, 다른 DAO 클래스가 만들어 진다면 어차피 다른 DB Table에 연결을 해야 하기 때문에, 새로운 getConnection()을 만들어야 하는 거라고 생각이 드는데, 이것이 왜 상속을 사용한 방법의 단점인지 모르겠습니다. 만약 이후 내용처럼 독립된 클래스에 getConnection()을 만든다면 새로운 DAO 클래스가 생겼을 때 다시 구현할 필요가 없을까요?

limjongheok commented 9 months ago

getConnection 메소드는 현재

Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/springbook","root","root");

다음과 같이 데이터 베이스 연결에 사용하고 있습니다.

그래서 현재처럼 확장된 상속을 사용할시

public class User extends  UserDao{
    @Override
    public Connection getConnection() throws SQLException {
        // n사 mysql
        Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/springbook","root","root");
        return c;
    }
}
public class Product extends  UserDao3{
    @Override
    public Connection getConnection() throws SQLException {
        // n사 mysql
        Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/springbook","root","root");
        return c;
    } // user에서 연결했는데 같은 데이터 베이스 사용하는데 product에서도 다시 연결
}

다음과 같이 도메인 마다 Connection을 연결해야하는 중복되는 문제가 됩니다. 어차피 도메인들은 같은 데이터베이스를 이용

그래서

public interface ConnectionMaker{
   Connection makeConnection();

}
public mysql implements  ConnectionMaker{
   @Override
    Connection makeConnection(){
       return connection // mysql  -> nosql 필요시 구현을 통한 확장 가능
    };
}
class UserDao{
    ConnectionMaker connectionMaker;
    public UserDao(ConnectionMaker connectionMaker){
         this.connectionMaker = connectionMaker;
   }

   public void add(){
         Connection c = connectionMaker.makeConnection();
         //c. () //  user add 쿼리 날리기  
    }

}

class ProductDao{
    ConnectionMaker connectionMaker;
    public UserDao(ConnectionMaker connectionMaker){
         this.connectionMaker = connectionMaker;
   }

   public void add(){
         Connection c = connectionMaker.makeConnection();
         //c. () //  상품 add 쿼리 날리기 
    }

}

다음같이 분리하여 사용시 더욱 유연하게 사용할 수 있지 않을까 생각합니다.