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

11 1님의 프로필 이미지
11 1

작성한 질문수

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

회원 서비스 테스트

beforeEach를 추가했음에도 afterEach가 필요한 이유

해결된 질문

작성

·

504

·

수정됨

3

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]

강의 마지막에 beforeEach 메소드를 추가하여 매번 객체를 생성하게 되잖아요.

그러면 굳이 afterEach() 메소드로 매번 clear할 필요가 없다고 생각했었는데 afterEach() 메소드를 주석 처리하면 오류가 나더라고요.

 

제 생각엔 MemoryMemberRepository의 store 변수가 static이기 때문에 beforeEach() 메소드로 매번 객체를 새로 생성하더라도 static 변수는 새로 생기지 않고 기존의 것이 계속 공유되고 있기 때문에 afterEach()가 필요한 거 아닐까 싶은데

제가 정확히 이해한 게 맞는지, 제 생각에 오류가 있는지 궁금합니다.

답변 2

2

안녕하세요. 11 1님, 공식 서포터즈 David입니다.

네, 맞습니다.

static 변수는 동일 타입 인스턴스 전체가 공유하게 됩니다.

따라서, 각 테스트 메서드가 서로 다른 메서드에서 변경한 내용에 영향을 받지 않게 하기 위해 store를 초기화 시키는 로직을 afterEach()를 통해 수행하는 것입니다.

감사합니다.

11 1님의 프로필 이미지
11 1
질문자

감사합니다

2

제 생각입니다!

MemberRepository의 store 변수가 static이기 때문이 맞습니다.

BeforeEach에서 생성되는 각각의 MemberRepository는 각각 생성되기 때문에 주소 값이 다릅니다.

(참고로 new 연산자를 통해 생성된 인스턴스는 Heap 메모리 영역에 저장됩니다.)

하지만 MemberRepository의 store 변수는 static 키워드를 사용하여 static 메모리 영역에 저장이 됩니다.

static 메모리 영역은 메모리에 한번 할당되면 프로그램이 종료될 때 해제가 됩니다.(GC가 관리하지 않습니다.)

이 static 영역은 다른 인스턴스들이 공유할 수 있는 메모리이기 때문에 (객체가 생성되기 전에 이미 할당 되어 있습니다.) 다른 MemberRepository 객체라도 같은 store를 공유하게 되는 것입니다.

따라서 여러 인스턴스에서 하나의 변수를 공유해서 사용하고 싶다면 static 변수를 고려하게 됩니다.

11 1님의 프로필 이미지
11 1
질문자

감사합니다

11 1님의 프로필 이미지
11 1

작성한 질문수

질문하기