본문 바로가기

프로그래밍/ect

SOLID, 객체 지향 설계 5원칙 : 의존 역전 원칙 (Dependency Inversion Principle)

By Angelacleancoder - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=88628927


DIP (Dependency Inversion Priciple) : 의존 역전 원칙

'고수준 모듈은 저수준 모듈에 의존해서는 안되며,저수준 모듈이 고수준 모듈에 의존해야 한다.' 는 원칙이다.

 

고수준의 모듈이라는 것은 입출력과 거리가 먼 비즈니스와 관련된 추상화 모듈을 말한다.

 

저수준 모듈은 입출력과 가까운 HTTP, 데이터베이스, 캐시 등과 관련한 구현 모듈(세부사항)을 말한다.

 

결국, 비즈니스와 관련한 부분이 세부사항에는 의존하지 않는 설계 원칙을 의미한다.

 

추가로 의존 관계라는 것에 대해서 잠깐 설명하자면 다음과 같은 클래스가 있다고 할 때, 누가 누구를 의존하고 있는 것일까?

class A {
    val b = B()
    ...
}

class B {
    ...
}

 

클래스 A가 B를 인스턴스로 가져다 쓰고 있기 때문에 A가 B에 의존적이라고 할 수 있다.

 

따라서, 어떤 클래스가 한 기능을 수행하기 위해서 다른 클래스의 서비스가 필요한 경우 클래스 간 의존 관계가 있다고 말할 수 있다.

 

다시 돌아와서 DIP란 의존 관계를 맺을 때, 변하기 쉬운 구체적인 것 보다는 변하기 어려운 추상적인 것에 의존해야 한다는 것이다.

 

추상적인 것에 의존함으로써 유연하고 확장 가능한 어플리케이션을 만들 수 있게 된다.

 

우리는 이전 글에서 이미 DIP를 준수한 의존 관계를 맺어본 적이 있다.

 

UserService에서 SimplePasswordEncoder 구현체에 직접 의존하는 것이 아닌 PasswordEncoder 인터페이스를 의존하도록 한 것이다.

 

UserService가 변하기 쉬운 구현체 SimplePasswordEncoder에 의존하는 것은 DIP를 위반하는 것이다.

 

따라서, PasswordEncoder 인터페이스를 의존하여 비밀번호 암호화 정책이 변경되어도 고모듈인 UserService는 수정할 필요가 없도록 하는 것이다.

 

요약하자면 DIP는 추상화를 이용하는 것이라고 볼 수 있다. 따라서 개방 폐쇄 원칙과 밀접한 관련이 있어 의존 역전 원칙에 위배되면 개방 폐쇄 원칙에 위배될 가능성이 높다.

 

또한, 의존성이 역전 되는 시점은 컴파일 시점이다. 런타임 시점에는 UserServicer가 SHA256PasswordEncoder 구현체에 의존한다.

 

의존 역전 원칙은 컴파일 시점이나 소스 코드 단계에서 의존성이 역전되는 것을 의미한다. 

 

https://gummy119.tistory.com/48

 

SOLID, 객체 지향 설계 5원칙 : 개방 폐쇄 원칙(Open Closed Principle)

OCP (Open Closed Principle) : 개방 폐쇄 원칙'확장에 대해서는 개방되어 있고, 수정에 대해서는 폐쇄적이어야 한다.' 는 원칙을 말한다. 확장에 대해 개방적이라는 것은 변경 사항이 생길 때, 새로운

gummy119.tistory.com

 

* 변하지 않는 부분은 고정하고, 변하는 부분은 생략해 변경이 필요한 부분은 수정하는 것이 추상화이다.