스프링 통합테스트JPA 통합 테스트통합테스트란?@SpringBootTest 단위 테스트단위 테스트 통합 테스트 차이

[Spring Boot] Spring Test를 이용한 효율적인 통합 테스트전략

KUKJIN LEE
KUKJIN LEE
2024년 12월 9일
287

Spring Boot 애플리케이션을 개발할 때, 전체 시스템의 통합성과 동작을 검증하기 위해 통합 테스트는 필수적입니다. 통합 테스트는 여러 컴포넌트들이 함께 잘 작동하는지 확인하며, Spring Test를 이용하면 이러한 테스트를 손쉽게 작성할 수 있습니다.

 

통합 테스트란 무엇인가?

통합 테스트는 애플리케이션의 여러 모듈들이 함께 작동하는지를 검증하는 테스트입니다. 단위 테스트가 개별 클래스나 메서드를 테스트하는 반면, 통합 테스트는 여러 컴포넌트를 함께 테스트하여 시스템의 전체적인 동작을 확인합니다. Spring Boot에서는 이러한 통합 테스트를 @SpringBootTest 어노테이션을 사용해 쉽게 작성할 수 있습니다.

 

@SpringBootTest를 이용한 통합 테스트 설정

@SpringBootTest는 Spring 컨텍스트를 로드하고 모든 빈을 주입하여 전체 애플리케이션을 테스트하는 데 사용됩니다.

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.test.web.servlet.MockMvc;

import org.junit.jupiter.api.Test;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerIntegrationTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testGetUser() throws Exception {
        mockMvc.perform(get("/api/users/1"))
                .andExpect(status().isOk());
    }
}

@SpringBootTestMockMvc를 사용하여 /api/users/1 엔드포인트가 정상적으로 동작하는지를 검증합니다. @AutoConfigureMockMvcMockMvc를 자동으로 구성해주는 어노테이션으로, 이를 통해 컨트롤러를 쉽게 테스트할 수 있습니다.

 

데이터베이스와의 통합 테스트

통합 테스트에서는 실제 데이터베이스와의 상호작용을 테스트하는 경우도 많습니다. 이를 위해 @DataJpaTest를 사용하여 JPA 레포지토리를 테스트할 수 있습니다. 예를 들어, 특정 엔티티가 데이터베이스에 올바르게 저장되고 조회되는지를 확인하는 테스트를 작성할 수 있습니다.

import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;

@DataJpaTest
public class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void testSaveAndFindUser() {
        User user = new User("john", "doe");
        userRepository.save(user);
        User foundUser = userRepository.findByUsername("john");
        assertThat(foundUser).isNotNull();
        assertThat(foundUser.getFirstName()).isEqualTo("john");
    }
}

@DataJpaTest 어노테이션은 JPA 관련 컴포넌트만 로드하며, 임베디드 데이터베이스를 사용하여 테스트를 빠르게 실행할 수 있습니다.

 

통합 테스트 작성 시 고려사항

  • 테스트 환경 격리: 통합 테스트는 실제 데이터베이스나 외부 API와 상호작용하기 때문에 테스트 환경을 격리해야 합니다. 이를 위해 H2 같은 임베디드 데이터베이스를 사용하거나, Mock 서버를 설정하는 것이 좋습니다.

  • 테스트 데이터 초기화: 각 테스트는 독립적으로 실행되어야 하므로, 테스트 데이터를 초기화하거나 롤백하여 다른 테스트에 영향을 주지 않도록 해야 합니다.

  • 실행 속도 최적화: 통합 테스트는 단위 테스트보다 느리기 때문에, 필요한 부분만 통합 테스트로 작성하고 나머지는 단위 테스트로 커버하는 것이 좋습니다.

 

통합 테스트는 전체 애플리케이션의 안정성과 동작을 보장하기 위한 중요한 과정입니다. Spring Boot의 @SpringBootTest와 관련 어노테이션들을 잘 활용하면, 복잡한 의존성을 가진 애플리케이션의 통합 테스트를 효과적으로 작성하고 유지할 수 있습니다.

관련 글

[SQL 입문] 필요한 데이터만 콕 집어 가져올 수 있는 WHERE 절

사용자는 테이블에 있는 모든 데이터를 다 보고 싶어 하지는 않습니다. 오히려 특정 항목에 대한 데이터만 가져오고 싶을 때가 훨씬 많습니다. 예를 들어, 어떤 사용자의 이메일이나 ID는 알고 있는데, 그 사람이 언제 우리 앱에 가입했는지 확인하고 싶다고 가정해 봅시다...

2026년 1월 27일10

SQL에서 SELECT란 무엇인가?

데이터베이스를 거대한 서류 보관함이라고 생각하면 됩니다. 보관함 안에는 수많은 데이터가 차곡차곡 쌓입니다. SELECT는 이 보관함에서 "내가 원하는 정보를 찾아줘!"라고 요청하는 명령어입니다. 이 과정을 전문 용어로 '쿼리(Query)'라고 부릅니다. &nbs...

2026년 1월 26일10

[SQL 기초] "언제 하나씩 다 넣어?" 데이터 한 번에 넣기

개발을 하다 보면 데이터베이스(DB)에 샘플 데이터를 대량으로 넣어야 할 때가 있습니다. 메뉴 100개를 추가해야 하는데 INSERT 문을 100번 쓰고 있다면? 너무 비효율적이죠! 오늘은 SQL에서 여러 데이터를 한 번에 넣는 '다중 삽입(Multiple Inse...

2026년 1월 21일13

SQL 데이터 삽입하기

데이터가 없는 데이터베이스는 연료 없는 로켓과 같습니다. 이제 'Missions' 테이블에 새로운 행(row)을 추가하는 방법을 알아보겠습니다. "삽입(Inserting)"은 '데이터 추가'를 의미합니다. 기존 Missions 테이블 ...

2026년 1월 20일12