woowacourse / tecoble-comments

0 stars 0 forks source link

tecoble/post/2020-08-31-jpa-transaction-test/ #12

Open utterances-bot opened 3 years ago

utterances-bot commented 3 years ago

JPA 사용시 테스트 코드에서 @Transactional 주의하기 | javable

서비스 레이어(@Service)에 대해 테스트를 한다면 보통 DB와 관련된 테스트 코드를 작성하게 된다. 이러면 테스트 메서드 내부에서 사용했던 데이터들이 그대로 남아있게 되어서 실제 서비스에 영향을 미칠 수 있기 때문에 테스트가 끝나면 지워야 할 필요가 있다. 이러한 문제를 해결하

https://woowacourse.github.io/tecoble/post/2020-08-31-jpa-transaction-test/

sonypark commented 3 years ago

비밥 좋은 글 잘 읽었습니다! 질문이 있는데요 :)

  1. 제가 이해한 바를 한 줄로 요약하면 "JPA를 사용하는 환경에서 rollback을 위한 테스트 코드를 짤 때 @Transactional보다 @AfterEach에 메서드에서 JpaRepository를 이용해 deleteAll() 하는 방식을 사용하자"라고 이해했는데 맞나요?

  2. JPA를 사용하지 않는 환경이라면 LazyInitializationException가 발생하지 않으니 사용해도 괜찮은건가요?

pci2676 commented 3 years ago

@sonypark

  1. 단순히 rollback을 위해서라면 제 주장은 맞습니다.
  2. JPA에서는 저런 문제가 나타날 수 있지만 Spring Data JDBC 같은 경우에는 그러한 문제가 나타나지 않았던것 같아서 사용해도 될 것 같아요(제 경험상..) 다른환경에서도 문제가 되지 않는지 확인한다면 사용해도 되지 않을까요?
sonypark commented 3 years ago

답변 감사합니다~

wannte commented 2 years ago

@pci2676 테스트의 목적에 따라 @Transactional의 사용 여부를 결정해야한다는 생각이에요!

Service layer의 테스트에서 '@Transactional 어노테이션의 동작까지 함께 테스트한다'를 목표로 둔다면 @Transactional 어노테이션을 붙이는 것은 이를 불가능하게 만드는 것이겠네요! JPA를 사용하게 되었을 때, @Transactional어노테이션의 동작의 테스트가 당연히 필요하다는 생각이고요!

반면에 DataJpaTest 같은 경우에는, @Transactional 어노테이션의 동작을 테스트하기보다는, 해당 repository의 동작방식의 테스트를 목적으로 두는 것이고요!

GPU 내껀데팀 부스에 찾아와주셔서 좋은 인사이트를 주고 가주셔서 감사합니다! :+1: 찾다보니 이 글까지 이르게 됬네요!