인프런 커뮤니티 질문&답변

멍멍젤리님의 프로필 이미지
멍멍젤리

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

회원 서비스 테스트

BeforeEach

해결된 질문

작성

·

343

1

service에서 repository를 주입받을 때,

repository는 메소드 실행 전 new로 새로 만들기 때문에 테스트케이스의 메소드는 전부 다른 인스턴스를 주입받는 것 아닌가요?

 

아래 비슷한 질문에서 repository의 변수는 static이기 때문에 동일한 타입의 인스턴스가 전체 공유하고 있다고 답변 달아주신걸 확인했습니다.

이부분은 repository를 주입받는 방식이 아니라 service에 선언했을때도 동일한데 그럼 DI방식으로 분리하기 전후 차이점이 무엇인가요?

답변 1

1

안녕하세요, 인프런 AI 인턴입니다.

멍멍젤리님의 질문은 각각의 테스트 케이스가 서로 다른 MemoryMemberRepository 인스턴스를 사용하는 것에 대한 이해와 이를 통한 의존성 주입(DI) 전후의 차이점을 문의하고 있습니다.

일반적으로, 테스트에서 @BeforeEach를 사용하여 각 테스트 메서드 실행 전에 새로운 인스턴스를 생성하는 이유는 각 테스트가 독립적으로 실행될 수 있도록 보장하기 위함입니다. 그렇게 함으로써 아무리 많은 테스트를 실행하더라도, 한 테스트의 실패나 상태 변화가 다른 테스트에 영향을 주지 않습니다. 설명하신 두 번째 이미지에서 서포터즈분께서 MemoryMemberRepository의 내부 맵(store)이 static으로 선언되어 있어서 같은 저장소를 여러 인스턴스가 공유한다고 언급한 것으로 보입니다.

DI 방식으로 분리하기 전후의 차이점은 MemberService 객체가 MemoryMemberRepository 객체에 직접적으로 의존하지 않도록 만들어주는 것입니다. 즉, MemberService 내에서 new MemoryMemberRepository()와 같이 직접적으로 리포지토리 객체를 생성하는 대신, 외부에서 생성된 MemoryMemberRepository 객체를 생성자를 통해 주입받음으로써, 리포지토리의 구현 변경이나 테스팅 시 다른 리포지토리의 사용 등을 유연하게 대응할 수 있게 되는 것입니다.

비슷한 내용에 대한 설명을 담은 게시글 링크는 다음과 같습니다:

각 링크의 답변에서 @BeforeEach 사용의 목적, 의존성 주입(DI)의 이점, 그리고 static 필드의 공유 특성 등이 이미 잘 설명되어 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

멍멍젤리님의 프로필 이미지
멍멍젤리
질문자

아 아래 내용들도 확인해보니 Test의 각 메서드마다 같은 repository를 사용해야한다는 뜻이 아니라 Test와 Service에서 같은 repository를 사용해야된다는 뜻인것같네요!

빠른 답변 감사합니다~!👍👍

멍멍젤리님의 프로필 이미지
멍멍젤리

작성한 질문수

질문하기