DI, Dependency Injection

Jaemin_Eun·2024년 10월 9일

OCP, DIP 에 대한 얘기를 이어가자면
구체 클래스가 아닌 인터페이스에 의존해야한다는 것은 알고 있다.

public class OrderServiceImpl implements OrderService {
    private final MemberRepository memberRepository = new MemoryMemberRepository();
	
    //실행코드
    memberRepository.run();
}

위 코드에서 OrderServiceImpl은 인터페이스인 memberRepository의 메소드를 호출하므로 인터페이스에 의존하는 것이 맞다.
하지만 문제는 자신이 사용할 구현체를 본인이 생성하고 선택함으로써 동시에 구현체에 의존하게 되는 것과 마찬가지다.

public class OrderServiceImpl implements OrderService {
    private final MemberRepository memberRepository;

    public OrderServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    //실행코드
    memberRepository.run();
}

이 코드에서는 할당을 생성자로 넘기고 어떤 객체를 생성하거나 사용할지 선택하는 것을 본인이 직접 수행하지 않는다.
그 책임은 온전히 OrderServiceImpl 객체를 생성할, 외부 어딘가에게 전가되는 것이다.
다시말해 OrderServiceImpl 입장에서는 자신이 의존하게 될 대상을 외부에서 정해주는, 의존관계가 주입당하는 것 이다.
OCP, DIP를 지키기위한 방법이면서도, 하나의 책임만을 수행해야 한다는 SRP의 관점에서도 더 나은 구현 방식인 것으로 생각된다.

0개의 댓글