Dependency Injection(DI) : 객체 자체가 아니라 외부에 의해 객체의 의존성이 주입되는 설계 패턴
DI에는 필드 주입, setter 주입, 생성자 주입 3가지 방법이 있는데, 의존관계가 실행 중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입만 정리하겠다.
말로 이해하려면 어려우니 코드로 이해하면 빠르다.
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
}
예를 들어 MemberService의 클래스에서 MemberRepository 클래스의 객체를 필요로 한다고 가정하자.
이렇게 작성하면 MemberService가 구현체만 의존하는게 아닌 구체적인 클래스까지 의존하게 된다.
그 후, Test Code 작성 시 MemberService 객체와 MemberRepository의 객체가 모두 필요할 때
class MemberServiceTest {
MemberService memberService = new MemberService();
MemoryMemberRepository memberRepository = new MemoryMemberRepository();
}
이렇게 생성한다면, MemberService에서 생성된 MemberRepository 객체와 MemberServiceTest에서 생성된 MemberRepository 객체는 다른 객체이다.
그래서 이 둘을 동일한 객체를 사용하고 싶다면 MemberService에서 생성자를 이용한 뒤 Test Code에서 주입시켜 주면 된다.
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
class MemberServiceTest {
MemberService memberService;
MemoryMemberRepository memberRepository;
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
이렇게 외부에서 객체를 주입시키는 것을 Dependency Injection(의존성 주입)라고 한다.