Spring-Boot

[Spring-Boot] 테스트케이스의 @Transactional

뚜코맨 2024. 1. 12. 15:32

스프링부트로 통합 테스트를 하던 중 통합테스트를 해보았다.

 

간단한 테스트 코드를 보자.

 

memberService.join(member)

 

호출해서 실제로 데이터베이스를 select를 해보면 테스트 코드에서 테스트용으로 생성한 member 객체의 name인 'hello'가 반영이 된걸 볼 수 있다.

 

하지만, 테스트 코드의 의미와 다르게 실제 데이터베이스에 적용이 되는게 좀 이상하지않은가?

 

그렇다. 사실 우리가 테스트하는 데이터들은 실제 디비에 반영이 되지않고 테스트 내에서만 검증을 하고 마쳐야하고,

 

반복적인 테스트에도 예외가 없어야한다

 

여기서 만약에 한번 더 가입 테스트를 실행해보면

 

예상과 같이 이렇게 빨간 불이 뜨면서 내가 미리 선언해둔 '이미 존재하는 회원' 이라는 예외로 넘어가게 된다.

 

우리가 테스트를 할 때 반복적인 테스트를 하더라도 예외가 없어야하며, 실제 데이터베이스에 반영이 되지 않게 테스트를 해야한다.

 

이럴때 사용되는 애노테이션이 @Transactional 애노테이션이다.

 

@Transactional 애노테이션을 적용한 후에 테스트 결과와 실제 데이터베이스의 값을 확인해보자.

 

 

아까완 다르게 테스트용으로 testNameValue라는 값으로 회원가입을 진행해보았다.

일단 정상적으로 실행은 되었다.

 

왜냐, 중복된 이름이 아니니까. 데이터베이스에서 확인해보자.

 

 

@Transactional 애노테이션을 적용하니까 우리가 원했던 것처럼 실제 데이터베이스에 'testNameValue' 라는 회원이 적용이 되지 않았다.

 

다시 한번 실행을 해보아도 같은 테스트 결과가 나온다.

 

이렇듯 반복되는 어떤 경우의 테스트더라도 항상 테스트의 결과는 같게 나온다.

 

정리

테스트케이스에 이 애노테이션이 있으면, 테스트 시작전에 트랜잭션을 시작하고, 테스트 완료시에 항상 롤백하기 때문에 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는 것이다.