
MemberService 내부에서 Repository를 직접 new로 생성하면, 테스트 클래스에서 만든 Repository와 서비스 내부의 Repository는 이름만 같을 뿐 완전히 다른 메모리 주소를 가진 객체가 됨.
memberRepository.clearStore()를 호출해 데이터를 비웠다고 생각하지만, 실제 서비스가 사용하는 내부 저장소는 비워지지 않고 데이터가 그대로 남아있었음.클래스 내부에서 private final MemberRepository = new ... 방식을 사용하면 외부에서 이 객체를 통제할 방법이 없음.
서비스가 직접 객체를 만들지 않고, 생성자를 통해 외부에서 만들어진 객체를 받도록 구조를 변경해야 함.
// MemberService.java
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository; // 외부에서 넣어주는 걸 받기만 함
}
@BeforeEach를 사용해 각 테스트가 시작되기 전, 동일한 Repository 인스턴스를 생성하여 서비스에 주입함.
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository(); // 저장소 생성
memberService = new MemberService(memberRepository); // 같은 저장소를 서비스에 주입
}
이제 테스트 코드의 afterEach()가 비우는 저장소와 서비스가 사용하는 저장소가 완벽히 일치하게 됨.
의존성 주입을 적용하면 다음과 같은 이점이 있음.