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

김동현님의 프로필 이미지

작성한 질문수

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

회원 서비스 테스트

MemberService와 MemberServiceTest 관련한 질문입니다!

22.01.14 14:31 작성

·

175

0

[질문 내용]
안녕하세요. MemberService와 MeberServiceTest에 관련해 궁금한 점이있어 질문드립니다!
 
1.
MemberService 생성자에서 인자를 MeberRepository 타입(인터페이스)으로 넣은 이유는 추후에 만약 수동으로 빈을 등록할 시 이후 강의에 나오는 AppConfig에서 구현 클래스인 MemoryMemberRepository를 넣어 유연성을 높여주기 위함인가요?
 
2.
강의 후반부에 개발자님께서 말씀하시길 MemberService에서 사용하는 리포지터리와 MemberServiceTest에서 사용하는 리포지터리가 각각 new ~로 생성하여 다르다고 하셨습니다. 이를 수정하기 위해 MemberService에서는 생성자와 MemberServiceTest에서는 @BeforeEach에 있는 코드와 그 위에 코드를 통해 같은 리포지터리(인스턴스)를 사용할 수 있게끔 하였는데 이것이 왜, 어떻게 같은 인스턴스를 사용하게 되는건지 이해가 잘 가지 않습니다 ㅠㅠ

답변 2

4

David님의 프로필 이미지

2022. 01. 14. 15:28

안녕하세요. 김동현님, 공식 서포터즈 David입니다.

.
1. 네, 맞습니다. 구체에 의존하지 않고 추상에 의존하여 유연함을 확보하기 위함입니다.

2.

MemberService가 생성자를 통해 MemberRepository를 주입받지 않았을 때,

MemberServiceTest 내 아래 2가지가 선언되어 있습니다.

MemberService memberService = new MemberService();

MemberRepository memberRepository = new MemoryMemberRepository();

 

MemberService내에서 생성된 MemoryMemberRepository를 A객체

MemberServiceTest 내에서 생성된 MemoryMemberRepository를 B객체 라고 하겠습니다.

 

A와 B객체는 서로 다른 객체입니다.

하나의 테스트가 실행될 때마다 서로 다른 두 객체(A, B)가 A는 MemberService 내 동작을 맡고 있고, B는 MemberServiceTest 내에서 테스트시 저장된 정보를 초기화하기 위해서 사용되고 있습니다.

즉, B라는 객체는 테스트가 실행된 후 A, B 객체가 공유하고 있는 static 변수인 store를 초기화시키기 위함입니다.

이는 서로 다른 객체(A, B)를 사용하고 있는 것입니다.

 

이제는 추상에 의존한 MemberService로 바뀐 코드가 적용되었을 때,

beforeEach()에서 내에서 MemoryMemberRepository객체를 생성했습니다. 생성된 객체를  A객체라 부르겠습니다. 또 beforeEach() 내에서 memberService 객체를 생성할 때 생성자의 인자로 A객체를 전달했습니다. 이로써 MemberService 내에 사용될 객체도 A이고, afterEach() 내에서 사용될 객체도 A가 되는 것입니다.

이전처럼 A, B가 생성되어 사용되지 않고, MemoryMemberRepository객체가 1개만 생성되어 MemberService에도 주입되어 사용되고, Test 내에서도 사용되는 것입니다.

 

혹시 이해가 잘 안되신다면 강의 14분부터 천천히 다시 들어보시면 좋을 것 같습니다.

.
감사합니다.

0

김동현님의 프로필 이미지
김동현
질문자

2022. 01. 15. 14:14

아하! 수정 전 MemberServiceTest 내에서 MemberService memberService = new MemberService();에 있는 new MemoryMemberRepository 1개와 MemoryMemberRepository memberRepository = new MemoryMemberRepository(); 이렇게 두개의 다른 객체가 생성되었는데 코드를 수정 후 

@BeforeEach

public void beforeEach(){

          memerRepository = new MemoryMemberRepository(); // 여기서 생성된 리포지터리 객체가.                            .        memberService = new MemberService(memberRepository); // 여기에 대입되어 MemberServiceTest안에 하나의 리포지터리 객체가 있게 되었다 라는 것이 맞나요???

David님의 프로필 이미지

2022. 01. 15. 15:44

네, 맞습니다:)