• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

DB 값 질문

23.02.12 00:34 작성 23.02.12 00:35 수정 조회수 309

1

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

바로 질문 드리자면,!

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

 

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

 

감사드립니다.

답변 1

답변을 작성해보세요.

0

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

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

 

[1. 공유자원 관리]

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

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

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

 

[2. H2 환경]

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

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

 

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

감사합니다! 🙇

 

 

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

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

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

감사합니다.

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

감사합니다!! 🙏