상세 컨텐츠

본문 제목

Embedded H2 (In-memory) - Mock DataBase, For Unit Test

서랍/TDD

by 박복만 2021. 10. 30. 16:15

본문

살면서 처음으로 단위테스트를 할 수 있는 코드를 짜라는 가르침을 받았고 이젠 "어떻게"에 대해서 고민을 하게 되었다.

데이터에 접근하는 클래스를 테스트하고 싶은건데 어떻게 하면 데이터베이스를 깔끔하게 Mocking 할 수 있을까?

원하는 데이터들을 집어넣는것은 둘째치고 내 테스트 코드를 실행하는 사람들에게 데이터베이스 인스턴스를 준비시킬 수 있을까에 대한 고민이 생겼다.

  1. 테스트 데이터베이스 서버를 올려놓는다. -> 돈든다.
  2. H2 !

H2 디비를 어플리케이션에 embedding 하는 방법을 찾았다.

H2 embedded mode

H2 디비는 embedded mode를 사용할 수있는데 사용하려면

  • h2.jar파일을 내 프로젝트가 찾을 수 있게 준비하고
  • Jdbc Driver를 사용하고 (org.h2.Driver)
  • Database URL을 jdbc:h2:~/test 로 하면 유저의 홈 디렉토리에 test라는 Database가 생긴다는 것이다.

위의 방법대로 했을때 내가 원하는 행동을 할 수 있을까. 저렇게 한다면 단순히 유닛 테스트를 하기 위한 디비가 계속 생길 수 있다. 아마 같은 유닛테스트에 대해서 두번 진행하려고 한다면 문제가 생길 수 있다. 이미 동일한 이름의 디비가 생성되어 있으니.. 디비를 지워놓고 Test를 다시 Run하는 행동을 반복해야할 것이다.. 유닛테스트를 위해..
나는 같이 협업하는 사람들이 내가짠 유닛테스트 코드를 언제든지 Run만 누르면 할 수 있게끔 하고싶다. 그래서 Embedded Mode에 있는 것이 In-memory이다.

H2 in-memory mode

in-memory mode?를 사용하면 실행했을 때 Database가 메모리에만 올라가 있기 때문에 마지막 Connection이 끝났을 때 데이터가 모두 날라가게 된다. 유닛테스트와 같은 상황에서는 테스트가 끝나면 데이터가 유지되어야 할 이유가 없기 때문에 아주 적합한 모드라고 볼 수 있다.
JDBC URL은 jdbc:h2:mem:test 이런식으로 하고 Connection을 열어준다면 메모리상에 이름이 test인 DB가 생기는 것이다.
그리고 Connection이 끝나도 프로세스가 끝나기 전까지 데이터를 살려놓고 싶다면 DB_CLOSE_DELAY=-1을 URL뒤에 적어주면 된다.

사용예시

프로젝트의 Pom.xml파일에 H2 Database의 디펜던시를 추가해준다. Gradle로 빌드한 프로젝트이면 build.gradle 파일에 그 문법에 맞게 추가해주면 되고 그런것도 아니면 그냥 CLASSPATH에 추가해준다.

내가 Test할 클래스에 Connection을 주는 함수에 위에서 말한대로 url과 username, password 그리고 db driver설정을 해주면 이 함수가 호출될 때 메모리 상에 DB가 생성될 것이다.

Test 코드를 보면 테스트를 시작하면서 getConnection() 메소드를 호출한 순간 메모리상에는 test database가 만들어진 것이다. 그리고 그 커넥션을 가지고 테스트를 위한 데이터들을 준비해놓는 다던지의 행동을 할 수 있는 것이다.
이렇게 되면 그 누가 나의 테스트를 돌려도 간편하게 돌려볼 수 있게 된다.
다음에는 어떻게 데이터를 준비해놓는것이 좋을지에 대해서도 포스팅을 해야겠다. 그전에 데이터베이스를 mocking하는 방법중에서도 더 좋은 방법이 있나에 대해서도 알아봐야겠고...


출처
https://www.h2database.com/html/features.html#in_memory_databases

'서랍 > TDD' 카테고리의 다른 글

TDD란?) 클린 코드(로버트 C. 마틴) 9장 단위테스트  (0) 2022.07.16

관련글 더보기

댓글 영역