Backend
home
📘

[개념 정리] 의존관계 역전 원칙

생성 일시
2025/03/03 07:53
태그
Java
게시일
2025/03/03
최종 편집 일시
2025/03/03 08:11

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
복사