JUnit5 공식 문서 에 따르면 아래와 같이 설명하고 있습니다. 개별 테스트 메서드를 독립적으로 실행할 수 있도록 하고 변경 가능한 테스트 인스턴스 상태로 인한 예기치 않은 부작용을 피하기 위해 JUnit은 각 테스트 메서드를 실행하기 전에 각 테스트 클래스의 새 인스턴스를 생성합니다. 즉, 테스트 메서드가 실행될 때마다 매번 새로운 인스턴스가 할당되는 것입니다.
만약 저라면 클라이언트에서 해당 객체의 메서드 호출이 발생했을 때, 직접 프록시 객체를 생성할 것 같습니다. 해당 객체의 팩토리 객체를 만들고 그 안에서는 직접 동적 프록시 기술(리플렉션, JDK 동적 프록시, CGLIB)을 사용하거나, 스프링이 제공하는 ProxyFactory 를 통해서 프록시 객체를 생성하고 Advisor 도 직접 만들어 등록하는 식으로 구현할 것 같습니다. static 클래스의 경우 영한님께서 말씀해 주신 방법을 사용할 것 같습니다!
스프링 부트는 따로 DB 설정을 하지 않은 경우 자동으로 H2 In-Memory DB를 사용합니다. 실제로 main()를 통해 스프링 애플리케이션을 실행하면 여러 INFO 로그가 기록되는데, 그 중에서 "HikariPool-1 - Starting..." 아래에 "HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:bf2e96f8-38c7-4aae-abc0-7e7ab9b46a18 user=SA" 와 같은 로그가 기록됩니다. 이렇게 스프링 부트가 자동으로 H2 DB를 애플리케이션 내부에 구축하고, HikariCPDataSource 를 통해 DataSource를 생성해 스프링 빈으로 등록하는 것입니다. '섹션3 데이터 접근 기술 - 테스트'에서 '테스트 - 임베디드 모드 DB' 에서 이 부분 잘 설명해주십니다!