IT 정보/Spring

Test Code (mock vs 실제 DB + 트랜젝션)

개발하는 동그리 2025. 3. 28. 10:33
728x90
반응형

1. Mock을 사용한 단위 테스트

Mock을 사용하면 데이터베이스와의 실제 연결 없이, 메서드의 동작을 테스트할 수 있습니다.
  • 장점:
    • 빠른 테스트: DB와의 연결이 없기 때문에 테스트가 훨씬 빨라집니다.
    • 격리된 테스트: 특정 기능이나 메서드만 집중해서 테스트할 수 있습니다. 외부 의존성에 영향을 받지 않으므로 독립적입니다.
    • 단순한 설정: Mock을 이용해 간단히 테스트할 수 있으므로 복잡한 DB 설정이나 초기화가 필요 없습니다.
    • 빠른 피드백: 코드 변경 후 빠르게 피드백을 받을 수 있습니다.
  • 단점:
    • 실제 DB 연동 부족: DB와의 상호작용을 정확히 시뮬레이션하지 않으므로, 데이터베이스와의 실제 상호작용에서 발생할 수 있는 문제를 놓칠 수 있습니다.
    • 한계: 복잡한 쿼리나 데이터베이스 트랜잭션 로직을 정확히 테스트할 수 없습니다.
    • 테스트의 신뢰성 부족: Mock은 실제 환경을 정확히 재현하지 않으므로, 테스트가 실제 애플리케이션과 동일한 환경을 반영하지 않을 수 있습니다.

2. 실제 DB와 트랜잭션을 사용한 단위 테스트

이 방법은 실제 데이터베이스에 데이터를 저장하고, 테스트 후 트랜잭션을 롤백하여 원상태로 복원하는 방식입니다. Spring에서는 @Transactional 어노테이션을 사용하여 이를 쉽게 처리할 수 있습니다.
  • 장점:
    • 실제 DB 상호작용 테스트: 데이터베이스와의 실제 상호작용을 테스트할 수 있기 때문에, DB와의 연동에서 발생할 수 있는 문제를 발견할 수 있습니다.
    • 트랜잭션 기반 롤백: @Transactional을 사용하면 테스트 후 트랜잭션을 롤백하여 DB 상태를 원래대로 복구할 수 있습니다. 이로 인해 실제 DB에 영향을 주지 않으면서도 DB를 사용하는 테스트를 진행할 수 있습니다.
    • 완전한 테스트: DB와의 상호작용을 실제로 처리하므로, 데이터베이스 쿼리 및 트랜잭션 로직을 포함한 전체적인 로직을 검증할 수 있습니다.
  • 단점:
    • 테스트 속도 저하: DB와의 상호작용이 포함되기 때문에 테스트 속도가 느려질 수 있습니다.
    • 환경 의존성: 실제 데이터베이스가 필요하기 때문에, 로컬 DB나 CI/CD 환경에서 제대로 설정되어 있어야 합니다. DB 설정이나 연결에 문제가 생기면 테스트가 실패할 수 있습니다.
    • 복잡한 설정: 데이터베이스가 연동되므로 설정이 복잡할 수 있으며, 테스트 환경에서 DB 초기화, 데이터 삽입, DB 연결 등을 관리해야 합니다.

비교 : Mock vs (실제 DB + 트랜잭션)

속도 빠름 느림
테스트 격리 매우 격리됨 (외부 시스템 의존성 없음) DB 연동으로 인해 격리되지 않음
환경 의존성 의존성 없음 (DB나 외부 시스템 불필요) DB 설정 및 연결에 의존, 환경 설정 필요
테스트 신뢰성 데이터베이스와의 실제 연동 문제를 놓칠 수 있음 실제 DB 연동 문제까지 정확히 테스트 가능
쿼리 및 트랜잭션 테스트 복잡한 쿼리 및 트랜잭션 로직 테스트 불가능 실제 쿼리 및 트랜잭션 처리가 가능
복잡한 설정 필요 여부 설정이 간단 (Mock 객체로 처리 가능) DB 설정 및 트랜잭션 롤백 설정이 필요

 


단위 테스트에서는 Mock 객체를 사용하여 외부 시스템이나 DB와의 상호작용을 최소화하고, 빠르고 격리된 테스트를 수행하는 것이 중요합니다. 실제 DB와 트랜잭션을 사용하는 것은 통합 테스트에서 더 적합합니다.

하지만 예외적으로 단위 테스트에서 DB 연동을 간단하게 검증해야 할 필요가 있다면, 트랜잭션 롤백을 사용하여 실제 DB에서 테스트할 수도 있습니다. 그러나 이는 속도 저하와 환경 의존성 등의 단점이 있기 때문에 꼭 필요한 경우에만 사용하는 것이 좋습니다.

따라서, 단위 테스트에서는 Mock을 사용하고, 통합 테스트에서는 실제 DB와 트랜잭션을 사용하는 것이 권장되는 방식입니다.

728x90
반응형