작성
·
150
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
13:10 부터 시작하는 DI에 관한 코드 내용중 질문있습니다.
14:15 강의에 따르면
MemberService 클래스에서 만든 MemoryMemberRepository 와 MemberServiceTest 에서 new 하여 만든 것은 MemoryMemberRepository는 각각 다른 인스턴스겠죠. 같은 레포지토리여야 하는데 다른 레포지토리니까 추후에 문제가 생길 수 있다구 하시구요.
여기까지는 강의대로 이해가 갑니다.
그런데 이에 해결책으로 작성하신 의존성 주입 코드가 잘 이해가 가지 않습니다.
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
}
class MemberServiceTest {
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
...
}
이렇게하면 매 테스트 실행하기 전에 beforeEach()가 실행되고 MemoryMemberRepository를 각각 생성하고 MemberService에 넣어준다고 하시는데요,
제가 여기서 이해가 안가는건.. 이것도 결국 매번 MemoryMemberRepository를 생성하는 것이니 전부 다른 인스턴스로 생성 되는 것 아닌가요?
그러니까 지금 문제가 MemberService 클래스와 MemberServiceTest 에서 사용하는 MemoryMemberRepository가 원래는 하나로 사용 해야하지만 각각 new로 생성하여 다른 인스턴스로 사용하여 문제가 되기에 그것을 해결하려는 것이잖아요?
그런데 이번에 생성자를 통해서 MemoryMemberRepository를 매번 생성하여 넣는 것도 결국 또 각각의 인스턴스를 생성하여 넣는것 아닌가요?
이해가 잘 안가요ㅠ
답변 2
0
안녕하세요. yoon6669님, 공식 서포터즈 y2gcoder입니다.
제가 yoon6669님의 질문을 제대로 이해했는지 모르겠습니다.
생성자에서 MemberRepository 인스턴스를 받아 내부의 필드에 대입함으로써 의존성을 주입해주는 방식은 새로 MemberRepository 인스턴스를 따로 생성하는 것이 아닙니다!
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
위의 코드는 새로운 MemberRepository 인스턴스를 생성하고 그 참조값을 MemberService 생성시 생성자를 통해 넘겨주고 있습니다.
그리고 해당 생성자를 통해 넘어간 참조값은 MemberService 내부 필드에 매핑됩니다 🙂
새로운 MemberRepository 인스턴스를 생성하지 않고 이미 생성한 인스턴스의 참조값을 생성자로 전달 후 매핑해준다는 점을 말씀드리고 싶습니다!
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. yoon6669님.
현재 질문에서는 MemoryMemberRepository
가 각 테스트마다 새로운 인스턴스로 생성되는 이유와 의존성 주입을 통한 해결 방법에 대해 혼란스러움을 느끼신 것 같습니다. 많은 분들이 헷갈릴 수 있는 부분인데요, 자세히 설명드리겠습니다.
먼저, 의존성 주입을 통해 MemberService
가 테스트에서 사용하는 MemoryMemberRepository
와 동일한 객체를 사용하도록 설정합니다.
의존성 주입의 목표는 각기 다른 클래스에서 같은 인스턴스를 공유할 수 있도록 만들어주는 것입니다. 아래와 같은 점을 이해하시면 도움이 됩니다:
BeforeEach의 역할: @BeforeEach
애노테이션이 붙은 메서드는 각 테스트가 시작될 때마다 호출됩니다. 따라서, 각 테스트 마다 MemoryMemberRepository
와 MemberService
의 새로운 객체를 만들어, 독립적인 상태에서 테스트를 진행할 수 있게 됩니다. 이는 테스트 간에 상태가 공유되어 다른 테스트에 영향을 주는 것을 방지합니다.
일관된 인스턴스 사용: 강의에서 설명하셨듯이, MemberService
에 MemoryMemberRepository
를 주입하여 사용하므로, MemberService
가 사용하는 MemoryMemberRepository
와 테스트 내에서 사용하는 MemoryMemberRepository
가 동일한 인스턴스가 된다는 것이 핵심입니다. 즉, MemberService
가 왜 자체적으로 MemoryMemberRepository
를 생성하면 안 되는가는 의존성 관리 및 테스트의 독립성 때문입니다.
아래는 yoon6669님께서 궁금해 하신 내용을 포함하는 유사한 질문과 답변 링크입니다. 도움이 될 수 있을 것 같아 첨부드립니다:
유사한 질문들을 통해 동일한 문제에 대한 다양한 접근 방법과 답변을 확인해 보시길 추천합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
아..
MemberServiceTest에서 생성하는 MemberRepository 객체를 MemberService를 생성하면서 생성자를 통해 넘겨주니까.. 결국 MemberServiceTest에서는 MemberService에서 생성한 MemberRepository 를 넘겨받아 사용하는것고 결국 MemberService와 MemberServiceTest는 동일한 Repository를 사용한다는 말씀이죠?