주석처리 되어 있는 부분이 의존성 주입을 사용하지 않았을 때의 그림이다.
좋은 객체지향 개발을 위한 원칙 5가지 SOLID 중 D, DIP 의존 관계 역전 원칙에 어긋나는 코드이다.
MemberServiceImpl
은 인터페이스 MemberRepository
에 의존하고 있지만, 동시에 구현체MemoryMemberRepository
에도 의존하고 있다. 구체화와 추상화 둘 다 의존하고 있기 때문에 DIP에 위배된다.
다음과 같이 수정해야 한다.
생성자를 통한 의존성 주입이다. 이렇게 짜면 의존하게 되는 건 MemberRepository
인터페이스 하나기 때문에 DIP원칙을 잘 지키게 되고 다른 Repository를 사용해야 할때도 해당 memberRepository
객체를 넘겨주는 쪽에서만 코드를 변경하면 될 뿐, MemberServiceImpl
의 코드는 어떤 것도 건들 필요가 없다.
AppConfig
가 객체를 생성하고 주입시켜주는 역할 까지 하기 때문에, 다른 Repository
나 Service
는 기능 구현에만 집중할 수 있다.
한 가지의 예시로 한 줄의 코드만 봐서 쉽게 와닿지 않았는데, memberRepository
를 사용하는 객체가 수 백개가 넘을 때, 리포지토리 교체를 해야하는 경우 수 백개를 고치지 않고 단 한줄만 고치면 된다고 생각하니 매우 중요하고 유용하다고 느꼈다.