Spring Boot

Repository 테스트 코드

stophyeon 2024. 6. 20. 13:29
728x90

테스트 코드 사용 이유

 

어플리케이션 개발을 하면서 기능이 올바르게 동작하는지 확인하려고 할 때 전체 어플리케이션을 동작시키는 것은 비효율적이고, 오류가 난다면 DB에 변화가 발생할 수 있습니다.

위와 같은 이유로 테스트 코드로 확인을 하면서 개발을 해야합니다. 

테스트 코드에도 어플리케이션의 전체 구조를 테스트하는 통합 테스트와 일부 구조를 테스트하는 단위 테스트 2개의 종류가 있습니다.

예를 들어 Spring Boot로 어플리케이션을 개발할 때 Repository의 쿼리문이 제대로 동작하는지 확인하고 싶을 때는 통합 테스트가 아닌 단위 테스트로 기능을 확인해합니다.

 

단위 테스트

 

단위 테스트는 어플리케이션의 전체가 아닌 구조를 분리해 각각 테스트하는 방법입니다.

Controller,Service,Repository를 각각 테스트 할 때 사용합니다. 

테스트 코드를 작성할 때는 테스트하려는 함수에 @Test라는 어노테이션을 붙여서 사용합니다.

@Test 어노테이션을 선언함으로써 해당 메소드를 테스트하는 대상이라고 선언합니다.

테스트 코드를 작성할 때 테스트 클래스를 생성한 뒤 해당 클래스에 Test를 하는 클래스라는 것을 선언하는 어노테이션을 사용해야 합니다. 어노테이션의 종류에는 아래와 같이 5개의 어노테이션이 있습니다

 

@SpringBootTest 통합 테스트를 제공
@WebMvcTest Controller 테스트에 사용
@DataJpaTest Repository 테스트에 사용
@RestClientTest REST 통신시 데이터가 올바른 JSON형태로 오는지 테스트
@JsonTest JSON형태의 직렬화,역직렬화 테스트시 사용

 

Repository 단위 테스트

Repository 단위 테스트를 하는 경우 정의한 쿼리문이 올바르게 동작하는지를 확인합니다.

이 때 테스트 클래스를 만드는데 클래스에 @DataJpaTest 어노테에션을 선언하면 JPA 관련 설정만을 가져옵니다.

@DataJpaTest는 @Transactional이 포함되어 있어서 테스트가 끝나면 DB를 RollBack하는 기능도 있습니다.

하지만 테스트를 할 때 실제 운영하고 있는 DB를 사용한다면 문제가 되기 때문에 Test DB를 사용해야합니다.

어떤 DB를 사용할지에 대해 결정하는 방법은 @AutoConfigureTestDatabase 어노테이션을 사용하는 것입니다.

해당 어노테이션은 테스트할 때 사용하는 DB를 내장된 데이터소스를 사용할 것인지 다른 DB를 사용할 것인지를 결정합니다. 속성들은 아래 3개가 있습니다.

(replace = AutoConfigureTestDatabase.Replace.NONE)  @ActiveProfiles에 설정한 프로파일 환경값에 따라 데이터소스가 적용
(replace = AutoConfigureTestDatabase.Replace.ANY) 기본값 , 기본 내장 데이터소스가 적용
(connection = DB Type) 어떤 DB를 사용할 것인지 선언(H2,MySQL등등)

 

 

테스트 코드에서의 @Autowired

테스트코드에서 Repository클래스를 테스트하기 위해서는 해당 클래스가 Bean으로 주입되어야 합니다.

Spring은 Bean으로 등록한 클래스들의 의존관계를 자동으로 관리합니다. 어노테이션을 통해 등록하거나 Config파일에 따로 등록을 하는 경우가 있지만 단위 테스트를 하는 경우에는 Spring의 전체 어플리케이션이 동작하는 것이 아니기 때문에 자동으로 Bean으로 등록된 클래스들을 주입해주지 않습니다. 때문에 @AutoWired를 통해서 해당 클래스를 직접 주입하는 방식을 사용합니다.

 

테스트 코드에서의 QueryDSL 사용

 

QueryDSL을 테스트 코드에서 사용하기 위해서는 JPAQueryFactory가 Bean으로 주입되어야 합니다. 하지만 Repository에서는 JPAQueryFactory가 final을 사용해 의존성 주입을 했기 때문에 테스트 코드에서는 의존성이 주입되지 않습니다.

때문에 직접 빈으로 등록하는 config 파일안에서 등록해야합니다.

 

 

Bean으로 등록했다면 해당 Config 파일을 테스트 코드에 적용해야하므로 @Import 어노테이션으로 해당 Config 파일을 적용합니다. 이렇게 되면 Repository에 JPAQueryFactory가 의존성 주입이 되었으므로 QueryDSL의 쿼리문이 정상적으로 동작합니다.

'Spring Boot' 카테고리의 다른 글

Swagger  (0) 2024.03.14
Transaction  (0) 2024.02.14
Test 코드  (2) 2024.01.27
ObjectMapper  (0) 2024.01.27
리액티브 프로그래밍  (0) 2024.01.15