인프런 커뮤니티 질문&답변

차가운물님의 프로필 이미지

작성한 질문수

실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)

7강. Junit5으로 Spring Boot 테스트하기

DB 값 질문

해결된 질문

23.02.12 00:34 작성

·

370

·

수정됨

1

안녕하세요 코틀린강의부터 코프링까지 잘 듣고 있습니다.

바로 질문 드리자면,!

1.saveUserTest2라는 테스트케이스를 한 개 더 만들어서 모든 테스트를 진행 시킨다면, saveUserTest는 통과하지만 saveUserTest2는 DB데이터가 2개가 있어서 통과되지 못 합니다. 이럴 때는 어떻게 해야 독립적으로 DB값을 가지게 할 수 있나요? @Transactional 쓰는 rollback된다고 얼핏 들은 거 같은데 잘 모르겠네요..

 

2.실제 h2 DB에는 유저가 2명이 저장이 되어 있는데 테스트환경에서는 0명인 이유는 @SpringBootTest 어노테이션이 실제 실행환경과 완전히 독립된 환경을 만들어 주어서 그런 건가요?

 

감사드립니다.

답변 1

0

최태현님의 프로필 이미지
최태현
지식공유자

2023. 02. 12. 13:18

안녕하세요, 차가운물님!! 😊 좋은 질문 질문 감사드립니다!! 🙏

하나씩 답변 드려보겠습니다!

 

[1. 공유자원 관리]

서로 다른 테스트 함수에서 같은 DB를 사용해서 테스트가 실패하는 경우, 말씀해주신것처럼 @Transactional 어노테이션을 활용해서 rollback을 시키는 방법도 있고요!

@AfterEach 어노테이션이나 @BeforeEach 어노테이션에서 사용했던 DB 자원을 정리해주는 방법도 있습니다! 두 번째 방법을 <8강. 유저 관련 기능 테스트 작성하기>에서 소개해드리고 있어요!

개인적인 선호는 두 번째 방식인데요!! 그 이유는 트랜잭션 어노테이션을 테스트 함수에 작성하게 되었을 때, 원래는 테스트가 실패해야 함에도 @Transactional 어노테이션이 생김으로 인해 테스트가 성공해버릴 수 있기 때문인데요! 이 경우 잘못된 정보를 알려주기 때문에 매우 위험한 테스트라고 할 수 있습니다. 그래서 이런 경우를 원천적으로 막기 위해 저는 저는 두 번째 방식을 선호합니다!!

 

[2. H2 환경]

그렇지는 않습니다! 정확히는 @SpringBootTest 가 독립된 환경을 만들어주지 않고, 현재 되어 있는 H2 의 기본 설정 자체가 스프링이 시작할 때 완전히 새로운 H2 (메모리 DB) 를 만들도록 되어 있어 가능한 것입니다!

만약 테스트를 시작할 때 (그래서는 안되겠지만..) 개발환경의 MySQL을 쓰거나 운영환경의 MySQL을 쓰도록 하면 진짜 해당 DB의 데이터를 가져와 테스트가 이루어지게 됩니다.

 

혹시나 또 궁금한 점 있으시면 편하게 질문 주세요~

감사합니다! 🙇

 

 

차가운물님의 프로필 이미지
차가운물
질문자

2023. 02. 12. 15:17

아하 친절하고 빠른 답변 감사드립니다!

2번 질문에서 ddl 설정이 create로 되어 있어서 그런거였군요

환경을 mysql로 바꾼 뒤 ddl-auto를 validate로 하니까 테스트의 결과가 실제 DB에 반영이 되는군요.(실제론 그래서는 안되겠지만..)

감사합니다.

최태현님의 프로필 이미지
최태현
지식공유자

2023. 02. 12. 15:27

ㅎㅎㅎ 맞습니다! 그래서 혹시나 개발환경 혹은 운영환경 profile 설정을 하고 테스트를 돌리면 끔찍한 일이 벌어지죠... 이런일을 아예 막기 위해 IP차단(ex. RDS security group) 등을 하게 되고요!

감사합니다!! 🙏