본문 바로가기
JPA

@DataJapTest를 사용하는 이유

by sangyunpark99 2024. 7. 17.
package com.example.payment.transferHistory;

import com.example.payment.transferHistory.entity.TransferHistory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import java.math.BigDecimal;
import org.assertj.core.api.SoftAssertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;

@DataJpaTest
public class TransferHistoryRepositoryTest {

    @Autowired
    TransferHistoryRepository transferHistoryRepository;

    @Test
    @DisplayName("계좌 이체 내역을 저장합니다.")
    void 계좌_이체_내역을_저장합니다() throws Exception{

        //given
        TransferHistory transferHistory = TransferHistory.builder()
                .withdrawalAccountNumber("0123456789")
                .depositAccountNumber("1234567890")
                .transferAmount(BigDecimal.valueOf(10000))
                .amountAfterWithdrawal(BigDecimal.valueOf(0))
                .amountAfterDeposit(BigDecimal.valueOf(20000))
                .build();

        //when
        TransferHistory savedTransferHistory = transferHistoryRepository.save(transferHistory);

        //then
        SoftAssertions.assertSoftly(softAssertions -> {
            softAssertions.assertThat(savedTransferHistory.getWithdrawalAccountNumber()).isEqualTo(transferHistory.getWithdrawalAccountNumber());
            softAssertions.assertThat(savedTransferHistory.getDepositAccountNumber()).isEqualTo(transferHistory.getDepositAccountNumber());
            softAssertions.assertThat(savedTransferHistory.getTransferAmount()).isEqualTo(transferHistory.getTransferAmount());
            softAssertions.assertThat(savedTransferHistory.getAmountAfterDeposit()).isEqualTo(transferHistory.getAmountAfterDeposit());
            softAssertions.assertThat(savedTransferHistory.getAmountAfterWithdrawal()).isEqualTo(transferHistory.getAmountAfterWithdrawal());
        });
    }
}

 

Q. @DataJpaTest는 왜 사용하는가?

불필요한 full auto-configuration 사용을 막고, JPA 테스트와 관련된 configuration만 사용하기 위해서

그리고 기본적으로 Test코드에 @Transactional 어노테이션을 달아주지 않아도 @DataJpaTest는 각 테스트를 Transactional하게 해주고, 각 테스트가 끝날때, rollback해준다.

 

🔎 꼬리에 꼬리를 무는 질문

Q. @Test코드에서 왜 @Transactional을 사용하는가?

(1) 각 테스트 케이스가 끝날 때마다 Rollback을 해주기 때문에, 다음 테스트에 영향을 주지 않기 위해서 사용한다.

(2) 또한 여러 테스트가 동시에 실행이 될때, 일관성 있는 DB 상태를 만들기 위해서 사용한다.

 

내가 사용한 궁극적인 이유

테스트를 Rollback시킴으로 인해, 각 테스트를 독립적으로 실행할 수 있게 하기 위해서 사용했다.