인프런 커뮤니티 질문&답변
강의 의존성 주입 코드 질문.
작성
·
207
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를 매번 생성하여 넣는 것도 결국 또 각각의 인스턴스를 생성하여 넣는것 아닌가요?
이해가 잘 안가요ㅠ
답변 3
0
9개월 지난 시점에서 작성자님이 제 글을 보실지 모르겠지만, 비슷한 상황에 있을 학습자분들을 위해 제가 이해한 방식을 남겨놓습니다.
아시겠지만, 그래도 다시 한번 정리하면
"MemberService(이하 Service)와 MemberServiceTest(이하 Test)에서 각각 new MemoryMemberRepository(이하 Repository)를 하고 있으니 서로 다른 객체가 생성되어 문제가 발생한다."(이하 전제조건)
해결하기 위해 Service의 생성자를 만들어 수정하고, @BeforeEach로 각각 할당해줬습니다.(이하 해결방법)
제가 작성자님의 질문을 이해하기로는
"전제조건에서도 new로 각각 생성했는데, 해결방법에서도 결국은 @BeforeEach로 돌면 new로 할당되는게 똑같지 않냐"는 말씀 같아요.
비슷한 결로 느껴질 수 있지만 결국은 다른 결과로 이어집니다.
전제조건에서는 Service에서 생성한 Repository와 Test에서 생성한 Repository가 같아야 하지만 다르고, Test에서 생성한 Repository는 각각의 @Test에서는 다른 객체여야 하지만 같다는 문제점이 있었던 것입니다.
그래서 해결방법에서는 Service와 Test에서 생성한 Repository가 같게 설정했고(생성자의 인자를 통해 통일), Test에서 만든 Repository가 (@BeforeEach를 통해)@Test마다 다른 객체로 활용하게 됩니다.
따라서 작성자님이 이해하셨던 "결국 서로 다른건 똑같지 않냐"라는 질문은 전제조건이 다른 부분이었다고 말씀드리고 싶습니다.
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를 사용한다는 말씀이죠?