Written on
·
20
1
안녕하세요, 강사님. TDD 관련 강의 항상 잘 듣고 있습니다.
강의 내용을 따라 실습을 진행하던 중, 테스트 격리 전략에 대해 궁금한 점이 생겨 질문 남깁니다.
# 강의에서 다뤄주신 상황
강의에서처럼 여러 테스트 메서드에서 동일한 이메일 값을 사용하니, 테스트 클래스 전체를 실행했을 때 JPA의 유니크 제약 조건 위반 에러가 발생했습니다. 이로 인해 개별 테스트는 성공하지만 전체 테스트는 실패하는 상황에서 궁금증이 생겼습니다.
# 제가 먼저 생각한 해결책: @Transactional
을 이용한 롤백
저는 강의를 들여면서 이 문제를 해결하기 위해, 각 테스트 메서드에 @Transactional
애너테이션을 붙여 테스트가 끝나면 자동으로 롤백시키는 방식을 먼저 떠올렸습니다. 이 방법으로 각 테스트가 독립적인 트랜잭션 내에서 실행되고, DB 상태를 다음 테스트에 영향을 주지 않는 상태로 유지할 수 있다고 생각했습니다.
##강사님의 방식(임의 데이터 generator)에 대한 질문##
그런데 강사님께서는 강의에서 롤백 방식을 사용하지 않으시고, UUID 등을 활용해 매번 고유한 이메일 주소를 생성해주는 데이터 제너레이터 방식을 사용하셨습니다. 강의에서도@Transactional
을 성능 등 여러가지 이유로 인해 사용하지 않았다고 하셨는데요.
@Transactional
을 이용한 롤백 방식도 충분히 좋은 해결책이라고 생각했는데, 강사님께서 UUID 생성 방식을 선택하신 특별한 이유나 설계 철학이 궁금합니다.
혹시 제가 생각한 롤백 방식에 비해 UUID 생성 방식이 갖는 실용적인 장점(ex. 롤백을 하지 않으니 디버깅의 용이성(?))이 있을까요?
두 방식의 장단점과 어떤 상황에서 어떤 전략을 선택하는 것이 실무에서 더 좋을지에 대한 강사님의 고견을 듣고 싶습니다.
감사합니다!
Answer 2
0
저는 테스트를 위해서 @Transactional
애노테이션을 사용하거나 필요하다는 생각을 해본적이 없지만 상황에 따라서는 효율적인 방법일 수 있습니다.
다만 제가 @Transactional
애노테이션 쓸 생각을 하지 않는 이유를 (굳이) 떠올려 보자면 이런 것들이 있을 것 같습니다.
테스트 환경의 장치가 운영 코드의 동작에 영향을 주는 것을 가급적 피하고 싶다.
실제 비즈니스 논리는 빈 데이터베이스에서 실행되지 않는다.
테스트 결과를 이해하기 어려울 때 디버깅하기 쉽다.
@Transactional
애노테이션이 지원되지 않는 저장소(S3 등)를 사용하는 경우도 많다.
답변이 부족했다면 말씀해주세요!
0
안녕하세요, 인프런 AI 인턴입니다.
ykm8864님, 질문 감사드립니다.
@Transactional
을 사용하여 각 테스트 메서드가 독립적으로 롤백을 수행하는 방식은 매우 유용한 전략입니다. 이 접근 방식의 장점은 각 테스트가 독립적인 트랜잭션 내에서 실행되므로, 테스트 간의 데이터 충돌이 방지되고, 데이터 정합성을 유지할 수 있다는 점입니다. 하지만 이 방법은 테스트 실행 시 데이터베이스에 대한 명령이 실제로 수행되지 않기 때문에 디버깅이나 로그를 통해 문제점을 파악하기 어려울 수 있습니다.
반면에 UUID나 고유한 데이터를 사용하는 임의 데이터 제너레이터 방식은 데이터베이스에 실제로 명령을 수행하고, 데이터가 DB에 계속 남아있어 디버깅이 용이할 수 있습니다. 이는 특히 데이터의 충돌 가능성을 최소화하고, 데이터베이스의 실제 처리 상황을 살펴보고 싶을 때 유용할 수 있습니다. 또, 이 방식은 테스트 환경에 따라 성능 면에서 유리할 수 있습니다. 롤백이 필요 없기 때문에 트랜잭션 관련 오버헤드를 줄일 수 있기 때문입니다.
결국, 어떤 방법을 선택할지는 실무의 요구 사항에 따라 다릅니다. 즉, 디버깅이 용이한 환경이 필요한지, 아니면 테스트의 독립성과 성능이 더 중요한지를 고려하여 결정하는 것이 좋습니다. Spring Boot 및 JPA 테스트 시 @JdbcTest
나 @DataJpaTest
등의 자동 설정 기능과 결합하여 다양한 테스트 전략을 적용해보시는 것도 추천드립니다.
더 많은 도움이 필요하시면 언제든지 질문 주세요. 좋은 하루 되세요!
자세한 내용은 다음 URL을 참고하세요:
Spring Boot Testing JDBC Applications
Spring Boot Testing JPA Applications