private Connection getConnection() throws ClassNotFoundException, SQLException{
Class.forName("com.mysql.cj.jdbc.Driver");
String jdbc_url = "jdbc:mysql://localhost:3306/sqldb?charEncoding=UTF-8&serverTimezone=UTC&userSSL=false";
Connection con = DriverManager.getConnection(jdbc_url,"root","test1234");
return con;
}
public void insert(User user) throws ClassNotFoundException, SQLException {
// try - catch를 사용하지 않아요! (다른 곳에서 에러 처리)
Connection con = getConnection();
...(생략)...
- 우리가 만든 DAO를 Naver, Kakao에 판매한다는 가정을 해본다.
- 우리가 만든 DAO는 데이터베이스와 연결방식이 고정되어 있다.
- 하지만 naver와 kakao 입장에선 나름대로의 데이터베이스와 연결방식을 이용할 것이다.
그럼 해결방법은 무엇이 있을까?
- 소스코드 제공 ( 거의 발생하지 않음 )
- 상속을 이용해서 해결
→ 변경이 필요한 부분만 추상 메소드로 만든다.
/* 재사용성을 위해 추상 메서드 활용 */
/* UserDAO.java */
public abstract class UserDAO {
protected abstract Connection getConnection() throws ClassNotFoundException, SQLException;
... 고급 소스 코드 (생략) ...
package lecture0722.step2;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
// naver쪽 개발자가 해당 UserDAO를 이용하기 위해
// subclass를 작성
public class NUserDAO extends UserDAO{
@Override
protected Connection getConnection() throws ClassNotFoundException, SQLException {
// naver 나름대로의 connection 연결방법에 대한 구현이 나오면 된다.
Class.forName("com.mysql.cj.jdbc.Driver");
String jdbc_url = "jdbc:mysql://localhost:3306/sqldb?charEncoding=UTF-8&serverTimezone=UTC&userSSL=false";
Connection con = DriverManager.getConnection(jdbc_url,"root","test1234");
return con;
}
}
/* Main.java */
public class Main {
public static void main(String[] args) throws ClassNotFoundException, SQLException{
// Service없이 main에서 직접 로직처리를 해보아요!
// Naver 입장에서의 Main
UserDAO dao = new NUserDAO();
User user = new User();
user.setId("1");
user.setName("홍길동");
user.setPassword("1234");
dao.insert(user);
System.out.println("새로운 사용자 등록");
User user2 = dao.select("1");
System.out.println(user2.getName()+" "+user2.getPassword());;
}
}
- UserDAO에는 getConnection 이라는 추상 메서드가 있다.
그렇다면 객체 관점에서 이를 살펴보자~
- 객체를 실제로 만들어 내는 것은 하위 class에서 만들고 있다.
- NUserDAO에서 구체적으로 객체를 어떻게 생성할 것인지를 기술하고 있다.
- 하위 클래스에서 객체의 구체적인 생성 방법을 결정해서 사용하는 디자인 패턴을 factory method pattern이라고 한다.
객체를 재사용한다는 측면에서 좋은데 상속은 제한이 발생할 수 있다.
클래스가 강하게 결집( tightly coupled )되어 있기 때문에 문제가 생길 여지가 있다.
따라서 상속으로 인한 재사용성은 양날의 검을 가지고 있다.상속은 나름대로의 제약이 있기 때문에 다른 방식으로 구현해보자!