높은 수준의 모듈? 낮은 수준의 모듈? 이해가 안되어서 TIL에 정리하고자 한다.
Dependency Inversion Principle (의존관계 역전)
- 높은 수준의 모듈은 낮은 수준의 모듈에 의존하지 않아야 한다. 두 모듈 모두 추상화에 의존해야 한다.
- 추상화는 세부 사항에 의존하지 않아야 한다. 세부 사항은 추상화에 의존해야 한다.
예시
만일 우리가 MySQL 데이터베이스 사용하는 자바 어플리케이션을 만든다고 해보자.
그래서 (높은 수준) Java Application
에서 (낮은 수준)MySQL ODBC Driver
class를 이용해 작업하고 있다.
// Java Application
public class Main {
public static void main(String[] args) {
MySQLODBCDriver driver = new MySQLODBCDriver();
driver.query("select * from TIL;");
}
}
문제 발생
🚨 그런데 MySQL이 💵유료화 선언을 해버리면서 다른 ODBC Driver도 바꿔야하며 Java Application 에서 코드도 하나하나 바꿔야 한다. 너무 귀찮고 유지보수가 어려우며 버그가 터질지도 모른다!! 😩
// Java Application
public class Main {
public static void main(String[] args) {
// MySQLODBCDriver driver = new MySQLODBCDriver();
// driver.query("select * from TIL;");
MariaODBCDriver driver = new MariaODBCDriver();
dirver.execute("select * from TIL"); // 심지어 이 Driver의 메서드는 이전과 비슷하지도 않다! ㅠㅠ
}
}
해결 방안
이렇게 변하기 쉬운 ODBC Driver에 의존하는 Java Application은 쉽게 부서질 수 있는 나쁜 냄새(안좋은 구조)를 풍기고 있다.
이를 개선하기 위해, Java Applicatio이 변하기 쉬운 구체적인 ODBC Driver이 아닌 추상화된 ODBC Driver에 의존하게 하자.
이렇게 되면 다른 ODBC Driver로 변경돼도 Java Appication은 이제 그 영향을 받지 않는 형태로 구성된다.
- 기존에는 MySQL ODBC Driver가 어디에도 의존하지 않는 클래스 여, 추상적인 JDBC Interface 에 의존하게 됐다. ⇒ 의존 방향이 역전 됨!
- 그리고 자바어플리케이션은 자신보다 변하기 쉬운 JDBC Driver에 의존하던 관계를 중간에 추상화된 JDBC Interface 를 추가해 두고 의존 관계를 역전시키고 있음.
이 처럼, 자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 것이 의존 역전 원칙
이다.
'👨🏻💻 Development > ☕️ Java' 카테고리의 다른 글
JUnit의 @BeforeClass 와 static block {} (0) | 2021.10.20 |
---|---|
2021년 09월 16일 TIL - Mocking Static Method (0) | 2021.09.17 |
Java의 Object 클래스 (0) | 2021.08.07 |
[Java] String, StringBuffer, StringBuilder (0) | 2021.08.02 |