본문 바로가기
Spring

[Spring] DI : Dependency Injection

by happyhelen 2021. 8. 28.

DI 를 사용하는 이유와 생성자 주입을 선호하는 이유는 여러가지가 있지만

본 예제에서 DI 사용 이유는 테스트 코드를 작성함에 있어 MemoryMemberRepository() 의 객체 생성이 MemberSerivice 와 MemberSeriviceTest 에서 각각 생성되고 있는데, 새로운 객체를 만들어 테스트 하는 것이 아닌 만들어진 객체를 가져와 테스트 하기 위해 즉, 테스트 대상을 하나로 일체화 시키기 위함이다

 

 

import ...

public class MemberService {
    
    private final MemberRepository memberRepository = new MemoryMemberRepository();
    
    //private final MemberRepository memberRepository;
    // DI: Dependency Injection
//    public MemberService(MemberRepository memberRepository) {
//        this.memberRepository = memberRepository;
//    }

    ...

}

 

 

import ...

class MemberServiceTest {
    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach(){
        MemberService memberService = new MemberService();
        MemoryMemberRepository memberRepository = new MemoryMemberRepository();
//        memberRepository = new MemoryMemberRepository();
//        memberService = new MemberService(memberRepository);
    }

   ...
    }

 

 

 


의존성 주입 이후)

 

 

생성자로 memberRepository 를 받아오도록 만들었다

import ...
public class MemberService {

    //private final MemberRepository memberRepository = new MemoryMemberRepository();
    private final MemberRepository memberRepository;
     //DI: Dependency Injection

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    
    ...
}

 

그리고 테스트의 독립성을 위해 테스트를 실행할 때마다 저장소를 생성하고 AfterEach 로 저장소를 지우는 작업을 진행시킨다

MemoryMemberRepository를 만들어서 생성자 호출로 MemberService 를 객체를 생성한다

결론적으로 같은 저장소를 사용하는 것이 된다

import ...

class MemberServiceTest {
    MemoryMemberRepository memberRepository;
    MemberService memberService;

    @BeforeEach
    public void beforeEach(){
//        MemberService memberService = new MemberService();
//        MemoryMemberRepository memberRepository = new MemoryMemberRepository();

// 테스트 실행할때마다 독립적으로 저장소 생성하기 위함
// 같은 MemoryMemberRepository 가 사용될 것임

        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository); // 생성자호출
    }

	...
}

 

DI 에 대해 가장 잘 이해하게 도와준 다른 분의 포스팅이다

참고자료: https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/