[SOLID] 의존 역전 원칙

이재훈·2023년 8월 15일
0

SOLID

목록 보기
5/5

객체지향의 핵심 원리와 원칙들

DIP, 의존 역전 원칙

DIP : Dependency Inversoin Principle
고수준 컴포넌트는 저수준 컴포넌트에 의존하지 않아야 한다.

의존 역전 원칙이 깨진 상황과 지켜진 상황


그림처럼 서비스는 레포지토리 클래스에게 의존하고 있습니다. 이것을 어떻게 변경하면 될까요?

고수준 컴포넌트와 저수준 컴포넌트 사이에 고수준 컴포넌트인 Repository(interface)를 만들어서 서비스와 레포지토리들이 인터페이스에 의존하게 변경하였습니다. 화살표를 보듯이 의존 방향이 역전된 것을 확인할 수 있습니다.

개방 폐쇄 원칙(OCP)과 비슷해보이는 의존 역전 원칙

개방 폐쇄 원칙은 확장하거나 변경할 때 다른 코드들이 영향을 받지 않게 만드는 것이고,
의존 역전 원칙은 고수준 컴포넌트가 저수준 컴포넌트에 의존하지 않도록 하는 것입니다.

앞에 게시글에서 작성했듯이 인터페이스를 사용하여 문제를 해결했지만 관점이 다르다는 것을 생각하여야 합니다.

간접적으로 의존 역전 원칙이 깨지는 상황과 그 해결 방법


위의 예시와 같이 각각의 Exception을 넘기고 Service에서 try-catch를 사용해서 예외 처리를 하려고 합니다.

public class Service {
	private Repository repository;
    
    public Object findById(Long id) {
    	Object obj = null;
        
        try {
        	obj = repository.findById(id);
        } catch (RecordNotFoundException e) {
        	// 예외처리
        } catch (TextNotFoundException e) {
        	// 예외처리
        }
   
    	return obj;
    }


}

이렇게 다른 에러를 보내기 때문에 try-catch가 분기되어 예외처리를 하게 됩니다. 여기서 중요한 점은 RecordNotFoundException, TextNotFoundException를 통해 repository의 구현체가 어떤 exception을 던지느지 간접적으로 알 수 있다는 점입니다. 이것은 간접적으로 의존 역전 원칙이 깨지는 상황을 만들고, 캡슐화가 깨졌다고 표현할 수 있습니다.


ArrayListReposiotry가 추가되었습니다. 또한 던지는 exception이 다르고 당연히 서비스에 try-catch코드에 예외처리하는 로직이 추가될 것입니다. 개방 폐쇄 원칙도 깨진 것입니다.

어떻게 해결할까?


추상적인 예외를 만들어 Throw 하는 방법입니다. 모든 구현체들이 똑같은 Exception을 던지고 Service에서는 해당 Exception만 예외처리를 하면 됩니다. 이것은 또한 캡슐화를 지키는 코드입니다. Service는 어떤 구현체가 사용되는지 모르게 되는 것 입니다.

의존 역전을 지키는 코드는 인터페이스를 통해 고수준 컴포넌트가 더 이상 저수준 컴포넌트에 의존하지 않도록 만드는 것으로, 의존 방향이 역전되기 때문에 의존 역전이라고 합니다.

결론

SOLID의 마지막인 DIP 까지 학습해 보았습니다. 각자의 관점은 다르지만 SOLID를 공부하면서 중점적으로 보이는 것이 미래에 변경될 것이나 확장에 유연하게 대처하는 방안 이라는 느낌을 받았습니다. 항상 코드를 작성할 때 현재와 미래를 생각하여 작성하여 작성해야 한다고 다짐합니다.


해당 게시글은 프로그래머스 스쿨 강의
"실무 자바 개발을 위한 OOP와 핵심 디자인 패턴(푸)"
를 정리한 내용입니다. 쉽게 잘 설명해주시니 여러분도 강의를 듣는 것을 추천드립니다.

profile
부족함을 인정하고 노력하자

0개의 댓글