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/
'Spring' 카테고리의 다른 글
[Spring] 싱글톤 컨테이너와 @Configuration (0) | 2021.11.28 |
---|---|
[Spring] @Configuration, @Bean 이해하기 (0) | 2021.11.26 |
[Spring] Optional <T> (0) | 2021.08.26 |
[Spring] 정적컨텐츠, MVC와 템플릿엔진, API (0) | 2021.08.23 |
[Spring] Windows에서 cmd로 빌드&제거 (feat. IntelliJ) (0) | 2021.08.22 |