[Spring] In memery 방식을 통한 JPA Repository 단위 테스트

윤성철·2024년 10월 8일

Back-End

목록 보기
14/22
post-thumbnail

서론

사이드 프로젝트 수행 중, QueryDSL로 작성한 동적 쿼리에 대해 단위 테스트 코드를 작성하게 되었다. 로컬DB를 통해 단위 테스트를 정상 통과하는 것을 확인하고, CI/CD를 통한 배포 중 오류에 부딪혔다.

운영 서버에서는 RDS에 올라간 DB로 Repositort 계층 단위테스트를 수행하는데, 내부 데이터가 달라서 테스트를 통과하지 못하는 문제였다.

본론

💡 테스트 환경을 독립적으로 구성하는 것을 고려하게 되었다.

In-Memory DB를 이용한 테스트 환경 구축

  • 장점

    • 메모리상에서 DB와 관련 작업을 처리하기 때문에 빠른 속도
    • 테스트 안에서만 독립적으로 수행되기 때문에 다른 것에 영향 받지 않음
    • 실행이 완료된 테스트는 모두 휘발되어 이후 테스트에 영향을 주지 않음
  • 단점

    • 실제 환경과 동작되는 구성이 달라 모든 상황에 대해 완벽한 테스트를 했다고 볼 수 없음

기술적인 고민

빠른 속도를 기반으로 테스트를 수행하는 것보다, 정확하게, 다양한 환경에서의 테스트가 더 중요하다고 생각했다.

⚡ 그럼에도 InMemoryDB를 적용하게 된 이유

  1. 언제, 어디서, 모든 시점과 환경을 고려하여 테스트를 수행하는 것은 불가능에 가깝다.
  2. 당장 로컬 환경과 배포 환경만 비교하더라도, 운영체제가 다르고, 사용하는 DB도 다르고, 운영 데이터도 다르다.
  3. 위와 같은 이유로, 이미 개발 환경과, 배포 환경이 다르기 때문에 독립적으로 테스트 환경을 구성하는 것이 이점이 많겠다라고 판단해서 도입하게되었다.

In-Memory DB 환경 설정

  1. dependencies 추가

  2. properties 파일 작성

  1. @DataJpaTest, @ActiveProfiles 어노테이션 선언

테스트 수행

InMemory DB를 사용하기 때문에, 테스트 수행 전 더미데이터를 삽입하고, 영속성 객체를 담아둔다.

테스트 수행 결과

로컬에서는 정상적으로 수행되었다! 😆

그렇다면, 이제 대망의 CI/CD 파이프라인을 통한 배포 서버를 확인해보자..

성공적으로 테스트를 통과했다.

추가 트러블 슈팅

위 이슈는 예약된 키워드를 식별자로 사용해서 발생하는 것이라고 한다.

H2 2.X.X버전에서 ‘user’라는 키워드가 h2의 예약어로 사용되는 것이다.

  1. 테이블 명을 member로 수정한다
  2. application.yml(properties) 파일에 spring.datasource.url을 jdbc:h2:mem:testdb;NON_KEYWORDS=USER와 같이 NON_KEYWORDS=USER를 추가해서 h2에게 예약어가 아님을 명시해준다.
profile
내 기억보단 내가 작성한 기록을 보자..

0개의 댓글