Spring Boot/testing

비동기 테스트 주의 사항

최-코드 2025. 2. 1. 13:26

비동기 테스트를 진행할 시엔 스레드를 생성하여 테스트를 진행한다. 이 때 스레드를 생성하면 기존 트랜잭션이 적용되지 않기 때문에 기존의 존재하는 영속성 컨텍스트의 내용을 볼 수 없다.

즉, 메소드 A에서 user를 저장하고 새로운 스레드에서 이 user 정보를 토대로 데이터를 넣으려고 할 때 user를 찾을 수 없어 오류가 발생한다.

이를 위해선 메소드 A에서 @Transactional을 제거해줘야 한다. 만약 class 위에 @Transactional이 붙어있다면 @Transactional(propagation = Propagation.NOT_SUPPORTED)를 붙여준다. 이를 통해 user를 저장할 때, save 메소드를 통해 db에 데이터가 적재된다. 

(만약 메소드 A에 @Transactional이 붙어있으면 user를 save할 때 트랜잭션이 전파되어 save 메소드가 끝나도 commit이 안 된다.)

 

cf) @BeforeEach의 트랜잭션은 테스트 메소드에 영향을 받는다. 즉, 테스트 메소드에 @Transactional이 있으면 이 트랜잭션을 공유하게 된다. 만약 없으면 @BeforeEach에도 트랜잭션은 따로 없다.

 

cf) jpa의 save 메소드에 들어가보면 @Transactional이 붙어있다.

 

cf) EntityManager의 flush 함수는 DB로 트랜잭션 내에서 이뤄진 작업을 반영하는 것을 말한다. 즉, DB에는 반영은 되지만 롤백이  가능한 상태를 말한다. 이 때 commit이 실행되지 않으면, db는 flush 되기 전에 상태로 되돌아간다.

즉, commit은 데이터베이스에 영구 반영하는 것을 말한다. 즉, 롤백이 불가능한 상태를 말한다.