[Test] Persistence Layer Test(with Spring Boot, JPA)

2025. 7. 5. 18:18·Software Development/Test

통합 테스트의 필요성

지금까지 단위 테스트, TDD, 테스트를 문서로 활용하는 법까지 알아봤다. 그런데 실제 애플리케이션은 수많은 객체(모듈)들이 서로 협력하며 동작한다. A 모듈과 B 모듈이 만났을 때, 우리가 예상한 대로 잘 동작할까?

이걸 확인하려면 통합 테스트가 필요하다. 단위 테스트만으로는 전체 기능의 신뢰성을 보장하기 어렵기 때문에, 우리는 풍부한 단위 테스트와 함께 큰 기능 단위를 검증하는 통합 테스트를 병행해야 한다.

이번 시리즈에서는 스프링 부트의 계층형 아키텍처(Layered Architecture)에서 각 계층을 어떻게 테스트하는지 알아보자. 그 첫 번째 주자는 데이터를 책임지는 Persistence Layer다.

Repository (Persistence Layer) 테스트

Persistence Layer의 역할은 명확하다. 데이터에 접근(Access)하는 것. 비즈니스 로직 없이, 오직 데이터의 CRUD에만 집중해야 한다.

"스프링 데이터 JPA가 알아서 해주는데 테스트가 필요한가?" 싶을 수 있다. 하지만 직접 작성한 JPQL에 오타가 있을 수도 있고, 복잡한 쿼리 메서드 이름이 의도와 다르게 동작할 수도 있다. 그래서 꼭 테스트가 필요하다.

이 계층의 테스트는 거의 단위 테스트에 가깝다. 테스트 방법은 크게 두 가지가 있다.

  1. @DataJpaTest: JPA 관련 빈만 주입해줘서 가볍고 빠르다. 내부적으로 @Transactional이 포함되어 있어 테스트가 끝나면 데이터가 자동으로 롤백된다.
  2. @SpringBootTest: 전체 스프링 빈을 다 띄우는 통합 테스트.

둘 중 뭘 써도 결과는 같지만, 여기서는 JPA에만 집중하는 @DataJpaTest를 사용해보자.

@ActiveProfiles("test") // (1)
@DataJpaTest
class ProductRepositoryTest {

    @Autowired
    private ProductRepository productRepository;

    @DisplayName("원하는 판매상태를 가진 상품들을 조회한다.")
    @Test
    void findAllBySellingStatusIn() {
        // given
        Product product1 = createProduct("001", SELLING);
        Product product2 = createProduct("002", HOLD);
        Product product3 = createProduct("003", STOP_SELLING);
        productRepository.saveAll(List.of(product1, product2, product3));

        // when
        List<Product> products = productRepository.findAllBySellingStatusIn(List.of(SELLING, HOLD));

        // then
        assertThat(products).hasSize(2)
                .extracting("productNumber", "sellingStatus") // (2)
                .containsExactlyInAnyOrder( // (3)
                        tuple("001", SELLING),
                        tuple("002", HOLD)
                );
    }

    // 상품 생성 편의 메서드
    private Product createProduct(String productNumber, ProductSellingStatus status) {
        return Product.builder()
                .productNumber(productNumber)
                .type(HANDMADE)
                .sellingStatus(status)
                .name("메뉴 이름")
                .price(4000)
                .build();
    }
}
  1. @ActiveProfiles("test"): 테스트용 프로필을 활성화해서 application-test.yml 같은 별도의 설정을 사용한다.
  2. extracting(): 검증하고 싶은 필드만 콕 집어 추출할 수 있다.
  3. containsExactlyInAnyOrder(): 리스트 내 요소들의 순서는 상관없이 내용만 정확히 일치하는지 검증한다.

이렇게 가장 아래 계층부터 테스트하며 단단하게 기반을 다졌다. 다음 글에서는 비즈니스 로직의 심장부, Service 계층 테스트에 대해 알아보자.

Ref) Practical Testing: 실용적인 테스트 가이드 강의 | 박우빈 - 인프런

'Software Development > Test' 카테고리의 다른 글

[Test] Presentation Layer Test(with Spring Boot)  (0) 2025.07.05
[Test] Business Layer Test(with Spring Boot)  (0) 2025.07.05
[Test] 테스트는 '문서'다.  (0) 2025.07.05
[Test] TDD(Test Driven Development)  (0) 2025.07.05
[Test] 단위 테스트(Unit Test)  (0) 2025.07.05
'Software Development/Test' 카테고리의 다른 글
  • [Test] Presentation Layer Test(with Spring Boot)
  • [Test] Business Layer Test(with Spring Boot)
  • [Test] 테스트는 '문서'다.
  • [Test] TDD(Test Driven Development)
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (456)
      • Software Development (27)
        • Performance (0)
        • TroubleShooting (1)
        • Refactoring (0)
        • Test (8)
        • Code Style, Convetion (0)
        • DDD (0)
        • Software Engineering (18)
      • Java (71)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (12)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (1)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (129)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (5)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
        • Clean Code (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[Test] Persistence Layer Test(with Spring Boot, JPA)
상단으로

티스토리툴바