1. 의존관계 역전 원칙이란?
•
구체화가 아닌 추상화에 의존해야 한다는 의미이다.
•
다른 구상 모듈(concrete modules)에 의존하는 구상 모듈 대신, 구상 모듈을 결합하기 위한 추상 계층을 사용한다는 것을 의미한다.
•
D는 구상 모듈을 분리한다.
2. 예제
의존관계 역전 원칙을 따르지 않는 경우
•
connect 메서드에 PostgreSQLJdbcUrl 타입의 인수를 넘긴다면 의존관계 역전 원칙을 어기는 것이다.
package bad;
public class PostgreSQLJdbcUrl {
private final String dbName;
public PostgreSQLJdbcUrl(String dbName) {
this.dbName = dbName;
}
public String get() {
return "jdbc:postgresql:// ..." + this.dbName;
}
}
Java
복사
package bad;
public class ConnectToDatabase {
public void connect(PostgreSQLJdbcUrl postgresql) {
System.out.println("Connecting to " + postgresql.get());
}
}
Java
복사
MySQLJdbcUrl과 같이 다른 JDBC URL 타입을 생성하는 경우라면 connect(PostgreSQLJdbcUrl postgresql) 메서드를 사용할 수 없다. 따라서 구체화에 대한 의존관계를 버리고 추상화에 대한 의존관계를 만들어야 한다.
의존관계 역전 원칙을 따르는 경우
•
각 JDBC URL에서 구현해야 하는 인터페이스로 추상화를 나타낼 수 있다.
package good;
public interface JdbcUrl {
public String get();
}
Java
복사
다음으로 PostgreSQLJdbcUrl 클래스는 JdbcUrl 인터페이스를 구현하며 PostgreSQL 데이터베이스에 특화된 JDBC URL을 반환한다.
package good;
public class PostgreSQLJdbcUrl implements JdbcUrl {
private final String dbName;
public PostgreSQLJdbcUrl(String dbName) {
this.dbName = dbName;
}
@Override
public String get() {
return "jdbc:postgresql:// ..." + this.dbName;
}
}
Java
복사
정확히 같은 방법으로 MySQLJdbcURL 클래스, OracleJdbcUrl 클래스 등을 작성할 수 있다.
package good;
public class MySQLJdbcUrl implements JdbcUrl {
private final String dbName;
public MySQLJdbcUrl(String dbName) {
this.dbName = dbName;
}
@Override
public String get() {
return "jdbc:mysql:// ..." + this.dbName;
}
}
Java
복사
마지막으로 ConnectToDatabase의 connect 메서드는 JdbcUrl 인터페이스에 의존하기 때문에 이 추상화를 구현하는 모든 JDBC URL에 연결할 수 있다.
package good;
public class ConnectToDatabase {
public void connect(JdbcUrl jdbcUrl) {
System.out.println("Connecting to " + jdbcUrl.get());
}
}
Java
복사