@Transactional
테스트 케이스에 @Transactional를 붙이는 경우 테스트 시작 전 트랙잭션을 시작하고, 테스트 완료 후 항상 롤백한다. 따라서 데이터베이스에 테스트 때 변경 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.
@AfterEach
위 어노테이션이 명시되어있는 메소드는 각 테스트 메소드 실행 후 무조건 실행된다. 각 테스트가 끝나고 공용 데이터를 깔끔하게 지우기 위해 MemoryUserRepository에서 respository.clearStore(); 메소드를 사용하려 사용한다.
하지만, AfterEach()를 이용해 clearStore() 하면 UserService 에서 생성한 MemoryUserRepository 객체와 UserServiceTest에서 생성한 MemoryUserRepository가 다르게 된다. 이에 따라 UserService에서 Dependency Injection을 사용해 userRepository를 저장하고,
-@BeforeEach
테스트 메소드 실행 전에 무조건 실행되는 beforeEach 부분에 UserService와 MemoryUserRepository 객체 생성 부분을 넣어준다.