Home @springboottest와 @datajpatest 차이
Post
Cancel

@springboottest와 @datajpatest 차이

@SpringBootTest와 @DataJpaTest 차이

연관관계 매핑 test를 하기 위해 어노테이션 설정을 했다.

이 전에 실제 db가 아닌 h2로 테스트 하기 위해서 test용 application으로 설정했었다.

@TestPropertySource(locations = "/application.properties")

또, @Transactional을 설정했는데 이를 한꺼번에 해주는 어노테이션이 있었다.



🐣 @Transactional

  • @Transactional을 사용하는 이유는 트랜잭션 처리를 하기 위해서다.
    • 일련의 작업들을 묶어서 하나의 단위로 처리
    • 자동으로 트랜잭션을 걸어서 테스트를 실행해주고 끝날 때는 rollback 처리를 해준다.
    • 관련 글



@SpringBootTest

  • full application config을 로드해서 통합 테스트를 진행하기 위한 어노테이션이다.

  • ApplicationContext에 모든 Bean들을 등록한다.
    • SpringBoot 어플리케이션을 실행했을 때와 동일하게 컨테이너에 Bean들을 등록한다.
  • 설정해놓은 config, context, components를 모두 로드한다.

  • DataSource bean을 그대로 사용하기 때문에 in-memory, 로컬, 외부 상관 없이 DB를 사용해서 테스트가 실행된다.

  • 테스트할 때마다 DB가 롤백되지 않기 때문에 @Transactional을 추가로 설정해줘야 한다.




@DataJpaTest

  • @DataJpaTest 어노테이션은 JPA 관련 테스트 설정만 로드한다.
    • Component Scan을 하지 않아 컨테이너에 @Component 빈들이 등록되지 않는다.
  • JPA를 사용하여 데이터를 제대로 생성, 수정, 삭제하는지 등의 테스트가 가능하다.

  • 기본적으로 in-memory embedded DB를 사용한다. (Replace.ANY;)

  • @Transactional이 포함되어있다.




@AutoConfigureTestDatabase

@DataJpaTest에 있는 @AutoConfigureTestDatabaseReplace.ANY;를 통해서

실제 db를 사용하지 않고 테스트 db로 테스트 할 수 있다. (기본적으로 내장된 임베디드 데이터베이스를 사용한다.)

image



Any 속성 외에도 AUTO_CONFIGURED와 NONE이 있다.

image


  • ANY
    • 자동 구성, 수동 구성된 DataSource 빈 모두 교체함
  • AUTO_CONFIGURED
    • 자동 구성된 DataSource 빈만 교체함
  • NONE
    • 어플리케이션에 기본 값으로 설정된 DataSource를 교체하지 않음




@DataJpaTest에서 in-memory 데이터베이스로 사용할 수 있는 db 유형

image

EmbeddedConnection으로 제공하고 있는것은 H2, DERBY, HSQL을 제공하고 있다.




실제 db를 사용하려면?

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)를 작성한다.




정리

기존 프로젝트에서 @SpringBootTest를 사용한 test 코드를 작성했을 때

db를 h2로 사용했을 때는 문제가 없었으나 mysql로 변경하면서


@SpringBootTest 어노테이션이 존재하는 클래스는

테스트를 실행하면 @SpringBootApplication 어노테이션을 검색하고

@SpringBootApplication에서 설정된 값을 읽어와서, 테스트에서 사용하기 때문에 mysql로 연결이 되었다.


테스트 코드에서는 기존 db대신 test용 임시 데이터로 사용해야 해서

test용 application.properties에서 h2 설정을 하고 여러 어노테이션을 붙였었는데

Jpa 관련 테스트를 할 때는 @DataJpaTest를 사용하는게 더 좋고 @SpringBootTest 보다 실행 속도가 더 빠르다.




출처
Spring DB : DB 테스트
[Spring] @SpringBootTest vs @DataJpaTest
[JPA] DataJpaTest: 테스트시에 실제 DB 사용하기
💥[@DataJpaTest] Error creating bean with name ‘dataSource’ 에러
스프링 부트 테스트 : @DataJpaTest
[Spring Boot] @DataJpaTest vs @SpringBootTest 비교

This post is licensed under CC BY 4.0 by the author.