[스프링] 관심사의 분리 ( 클래스의 분리 )
지난 포스팅에서 추상클래스를 이용하여 관심사를 확장시켰다. 그러나 상속이라는 특성상 자식클래스는 부모클래스의 1가지 관심사만 상속할 수 없다. 확장성을 고려하여 추상클래스를 사용했지만 완벽한 분리가 이루어지지 않은 것이다.
그래서 이번에는 완벽한 분리를 위해,
하나의 관심사를 다른 클래스로 '분리'시킬 것이다.
추상클래스 코드
public abstract class UserDao {
public abstract Connection getConnection(); // 추상 메소드
public int add(User user) throws SQLException {
Connection c = getConnection();
//생략....
}
public User get(String UserId) throws SQLException {
Connection c = getConnection();
//생략....
}
}
UserDao 추상클래스 안에 확장을 원하는 메소드를 추상메소드로 선언하였다. 그러나 상속은 단점이 있으므로 추상메소드의 관심사를 또 다른 클래스로 독립시킬 것이다.
SimpleConnectionMaker 클래스
public class SimpleConnectionMaker {
public Connection makeNewConnection() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/SpringProject";
String id = "root";
String pw = "11111";
Connection c = DriverManager.getConnection(url, id, pw);
System.out.println("커넥션 접근 객체 생성");
return c;
} catch (ClassNotFoundException e) {
System.out.println("클래스 발견 못함");
} catch (SQLException e) {
System.out.println("DB 접속 실패");
}
return null;
}
}
이와 같이, 커넥션 객체를 생성하는 클래스를 새로 생성한다. 이제부터, DB 커넥션을 생성할 클래스는 SimpleConnectionMaker 클래스와 관계를 설정해야만 가능하다. 관계 설정이란, 한 클래스가 다른 클래스를 '인터페이스 없이' 직접 사용한다는 뜻이다.
아래 코드는 UserDao 클래스가 DB에 레코드를 삽입하고 추출할 때 필요한 DB 커넥션 객체를 생성하기 위해, 생성자로 SimpleConnectionMaker 클래스와 관계를 설정하는 코드를 보여준다.
UserDao 클래스
public class UserDao {
SimpleConnectionMaker simpleConnectionMaker = null; // 커넥션 객체 생성 클래스
public UserDao(SimpleConnectionMaker simpleConnectionMaker) {
this.simpleConnectionMaker = simpleConnectionMaker; // 관계 설정 : 커넥션 객체 주입
}
public int add(User user) throws SQLException {
Connection c = simpleConnectionMaker.makeNewConnection(); // 커넥션 객체 생성 메소드 호출
// 생략....
}
public User get(String UserId) throws SQLException {
Connection c = simpleConnectionMaker.makeNewConnection();
// 생략....
}
}
이와 같이, 관심사를 클래스로 분리하여 변화에 대응하는 코드를 만들어 보았다. 그러나 아직 완벽하지 않다. 이전 포스팅에서 말했듯, DB는 다양한 DBMS를 갖는다. 그러므로 한 가지에만 '종속'되면 안 된다. 만약 위에 코드처럼, 직접 한 가지 클래스와 관계를 설정해버리면 서로 '종속'되어버려 확장성을 잃게된다. 이는 유지보수성에 좋은 영향을 주지 못한다.
다음 포스팅에서는 관심사를 클래스로 분리하면서 확장성까지 고려할 수 있는 방법에 대해서 포스팅하겠다.