loose
이로운 개발하기
loose
전체 방문자
오늘
어제
  • 전체 (207)
    • ☕ Java (24)
    • 📘 Effective Java (9)
    • 🍃 Spring (48)
    • 📖 ORM (9)
    • ☸️ Kubernetes (13)
    • 🐧 Linux (5)
    • 🐋 Docker (5)
    • 🛠️ CI & CD (7)
    • 🕸️ Web (6)
    • 🔗 Distributed System (3)
    • 📜 Js (10)
    • 📈 Database (11)
    • 🗂️ Etc (34)
    • 🧑 Chitchat (11)
    • 📒 문학 (11)
    • 👜 개인 공부 창고 (1)

공지사항

반응형

최근 글

최근 댓글

loose

이로운 개발하기

🍃 Spring

@Transactional을 테스트에 써야할까?

2023. 7. 23. 14:27
반응형
 

Don’t Use @Transactional in Tests

How to not ruin your Spring Boot application test suite

medium.com

예전에 이 글 보고 쓰지말자라고만 생각했다.

@Transactional을 써서 얻는 부작용이 꽤 많아 보였기 때문이다.

위 영상을 보면 @Transactional을 테스트에 쓰는 것이 단점에 비하면 얻는 장점이 많다고 한다.

영상에 나온 단점을 다 이해할 순 없지만 개인적으로 느꼈던 단점 중 하나는 트랜잭션이 비즈니스 로직에 적혀있지 않아도 테스트에 있는 @Transacitonal이 전파된다라는 특징 때문에 운영 서비스에 크리티컬 이슈를 발생시킬 수도 있다라는 생각을 했다.

영상에선 그 외 단점도 설명도 하고 있는데 JPA를 이용했을때 트랜잭션 테스트를 하고 싶으면 Flush를 명시적으로 사용해야한다고 한다.(사실 생각도 안해본 부분)
@Transactional을 테스트에 사용했을때 롤백으로 끝나는 테스트는 정작 DB까지 날아가지 않고 Flush가 되지 않는다고 한다. 그래서 DB에 잘 들어가는지 확인이 안되기 때문에 Flush를 명시적으로 사용해야한다고 한다.

그 외에도 Self-Invocation에 대해서도 얘기하고 계신데 이 부분은 단점인지는 잘 모르겠다.

 

그래서 원래는 @Transactional을 쓰지 말자라는 주의였는데, 저명하신 두분(토비+영한님)이 쓰자는 데 동의하시기 때문에 나도 그 생각에 휙 올라타기로 했다. 그 이유는 몇개가 있었는데 생각나는건 첫번째로 테스트코드 작성속도 빠르다라는 점이고 두번쨰는 DB용 단위테스트(보기에 따라 통테)가 쉽다는 것이었다.

 

여튼 나도 @Transactional을 안쓴다라는 마인드였는데 그런 생각에 대해 토비님이 마지막에 "그럼 DB 테스트는 어떻게 할건가요?"라는 얘기에서 나의 답변은 "통합테스트는 느리기도 하고 짤 생각이 딱히 없었다"였다.

단위 테스트는 기본적으로 기능이 잘 된다라는 가정하에 돌아간다고 생각해서 통합테스트를 안한다라는 생각을 했다.

하지만 영상에서는 테스트코드는 애플리케이션 코드를 완벽하게 검증할 수 없기에 실제 환경 테스트는 인수테스트를 해야하는거라고 말하고 있으며 완벽하지 않기 때문에 @Transactional을 사용하면서 단점을 정확히 인지하고 코드리뷰로 서로 검증하면서 테스트코드를 작성하는 것이 좋다라고 설명해주셨다.

 

재작년인가 작년쯤에 고민했던 부분을 大선배님들이 어떻게 생각하시는지에 대한 인사이트를 얻을 수 있어서 좋은 영상이었다.

728x90

'🍃 Spring' 카테고리의 다른 글

Spring Actuator + Prometheus + Grafana  (0) 2023.08.13
Spring Actuator와 Thread(+@Scheduled)  (0) 2023.08.12
@JsonProperty 사용법에 대한 모든 것  (2) 2023.07.09
스프링 클라우드 Config 구성하기(4)  (0) 2023.07.05
스프링 클라우드 Eureka 구성하기(3)  (0) 2023.07.05
    '🍃 Spring' 카테고리의 다른 글
    • Spring Actuator + Prometheus + Grafana
    • Spring Actuator와 Thread(+@Scheduled)
    • @JsonProperty 사용법에 대한 모든 것
    • 스프링 클라우드 Config 구성하기(4)
    loose
    loose
    불만하는 사람은 90명, 해결하는 사람은 9명, 리드하는 사람은 1명 음악과 낭만을 좋아합니다.
    hELLO. 티스토리 스킨을 소개합니다.
    제일 위로

    티스토리툴바