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

김승우님의 프로필 이미지

작성한 질문수

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

회원 서비스 테스트

질문있습니다.

작성

·

174

1

MemoryMemberRepository memberRepository = new MemoryMemberRepository();
MemberService memberService = new MemberService(memberRepository);

@AfterEach
void AfterEach() {
memberRepository.clearStore();
}

선생님이 제공해주신 방식은

이후에 생성될 객체를 참조할 변수 memberService, memberRepository를 미리 만들어두고, @BeforeEach를 이용해서 메소드들이 실행되기 전마다 새롭게 생성한 repository와 service 객체 인스턴스를 변수가 참조하도록 해주는 방법 인 것으로 이해했습니다.

그런데, 만약에 어차피 매번 BeforeEach메소드로 새롭게 생성된 repository, service 객체 인스턴스를 이용할거라면, @AfterEach를 이용해서 매번 clearStore()을 할 이유가 없지는 않나요?? 아니면 @AfterEach를 통해서 memory leak를 막는다던지,, 다른 의도가 있는 것인지요..

제가 작성한 코드는 BeforeEach를 사용하지 않고, 클래스에서 하나의 레포지토리와 service를 생성한 다음, afterEach에서 저장된 것들을 지워가며 재활용하는 방식인데 실무에서 권장되지 않는 방법일까요? test시에 잘 돌아가긴 하더라구요. 

실무에서는 어떻게 쓰는게 최적의 방법 인지 궁금합니다.

답변 2

4

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요 승우님^^

MemoryMemberRepository에 있는 store가 static으로 선언되어 있기 때문에 MemoryMemberRepository 객체를 삭제하고 다시 만들어도 초기화 되지 않고 남아있습니다. 따라서 clearStore()를 호출해서 데이터를 직접 삭제해주어야 합니다^^

그리고 JUnit은 각각의 테스트 메서드 마다 테스트 자체를 다시 만들어버립니다. 따라서 승우님이 작성한 코드도 각각의 테스트 마다 매번 새로운 객체가 생성됩니다. 사실상 @BeforeEach와 똑같은 것이지요. (직접 주소값을 찍어보시면 확인할 수 있습니다.)

따라서 둘중 아무것이나 사용해도 됩니다^^ 단순하면 필드에서 직접 처리해도 되고, 초기화가 복잡해지면 @BeforeEach를 사용하면 됩니다.

감사합니다.

0

그럼 질문내용과 답변을 보면 store 가 static 이 아니라면 
둘 중 어느 것도 같은 store 를 사용하는게 아닌것이 되겠네요?

중복 확인을 위해서면 store 가 static 이어야만 하겠네요..