들어가며..

테스트 코드에선 객체 생성 비용에 대해 고민하지 않았다. (약간 한 대 맞은 기분..) 따라서 이에 대해 학습하고 싶었다.
테스트 인스턴스 라이플 사이클
공식 문서에 따르면..
- 테스트 인스턴스의 상태는 불변이 아니므로 예기치못한 부작용이 발생할 위험이 있다.
- 이러한 위험을 피하고, 각 테스트 메서드를 격리해서 실행하기 위해서 JUnit은 각 테스트 메서드를 실행하기 전에 해당 테스트 클래스의 인스턴스를 새로 만든다.
- 각 테스트 메서드 마다(per-method) 새로운 테스트 인스턴스가 만들어지는 것은 JUnit의 기본 동작방식이다.
라고 적혀있다. 즉, 기본값이 메서드 마다 새로운 테스트 인스턴스 생성이다.
그러면 여기서 질문.. @BeforeAll은 어떻게 실행되는가?
참고로 @BeforeEach는 개별 테스트 실행 전 실행되고, @BeforeAll은 모든 테스트 실행 전 한 번만 실행된다.
근데 메서드마다 새로운 인스턴스가 생성되는데 어떻게 @BeforeAll 내부는 한번만 실행되는걸까?
답은 static이다.
@BeforeAll의 실행 메커니즘은 다음과 같다.
1. JUnit이 TestClass를 발견하고, 이를 로딩할 때 static 영역에 static 필드 + @BeforeAll 메서드를 올린다.
2. 이후 @BeforeAll static 메서드를 호출한다. 이는 자원을 초기화 해 static 필드에 저장한다.
3. 이후 인스턴스는 static 영역을 이용해서 @BeforeAll의 결과에 접근한다.
추가로 Java는 static멤버와 인스턴스 멤버를 메모리에 아예 다르게 저장한다.
새로운 인스턴스 -> heap 영역
static 멤버 -> static 영역
정리
따라서 위 리뷰어의 의견과 내 코드는 동일한 효과를 만든다. 하지만 이를 아예 staic 필드로 변경해서 한번만 실행되게 유도하는 것이 좋아보인다.
참고 자료
[JUnit5] @BeforeEach와 @BeforeAll은 어떤 차이가 있을까?
@BeforeEach와 @BeforeAll의 차이 @BeforeEach와 @BeforeAll는 실행 시점에 차이가 있다. 둘 모두 테스트 시작 전에 실행되는 것은 같지만, @BeforeEach는 개별 테스트 실행 전에 실행되며, @BeforeAll은 모든 테스트
kotlinworld.com
https://hyunki99.tistory.com/3
[Java] 자바 메모리 영역 Static, Stack, Heap
프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받고 그 메모리를 목적에 따라서 여러 영역으로 나누어 관리한다. 1. Static 영역 (Method Area, Class Area, Code Area라고도 불린다.) Java 파일은 크게 필
hyunki99.tistory.com
'개발 끄적끄적' 카테고리의 다른 글
| [디자인 패턴] 추상 팩토리 패턴, 팩토리 메서드 패턴 (0) | 2025.10.25 |
|---|---|
| [Spring] Refresh Token, Access Token, Rotation을 이용한 로그인 구현 (OAuth2.0 + JWT) (0) | 2025.09.14 |
| [Network + Spring] URL 관련 (0) | 2025.08.19 |
| [Spring] cookie, token, session (0) | 2025.08.08 |
| [Spring] Security - JWT 서버 구축 (4) | 2025.08.06 |