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시킴으로 인해, 각 테스트를 독립적으로 실행할 수 있게 하기 위해서 사용했다.
'JPA' 카테고리의 다른 글
동시성 문제 해결방법(Update Query편) (0) | 2025.01.29 |
---|---|
save()와 SELECT의 관계 (0) | 2025.01.26 |
JPA와 DB는 어떻게 동기화가 되는걸까? (0) | 2025.01.26 |
🙆🏻♂️ 너, Fetch Join 만능이야? (0) | 2024.09.24 |
🙆🏻♂️ 너, Fetch Join 좀 알고 싶다? (0) | 2024.09.22 |