단일 유형 개체에 대한 CRUD 기능은 JpaRepository를 extends 하는 것으로도 충분히 구현할 수 있습니다.
아주 심도 깊은 설계를 바탕으로 만들어진 시스템에서는 Spring Data JPA 만으로 서비스를 제공할 수 있을 것 같기도 합니다.
물론 대부분의 경우 서비스만을 생각하지 서비스 이후 축적되는 데이터와 이를 바탕으로 한 분석 용이성까지 고려하는 경우는 많지 않습니다.
복합 정보를 한 번에 쿼리하거나 데이터 분석에 필요한 자료를 만드는 경우를 생각해보면 객체를 만들고, 테스트하기 보다는 쿼리를 쳐가며 수정해가는게 효율적인 경우도 있습니다.
이런 경우 JPA 기반 개발자가 많이 사용하는게 JPQL, QueryDSL 정도가 될 것 같습니다.
이번 포스트에서는 간단하게 JPQL을 테스트하는 방법을 예시로 작성했습니다.
Custom Repository 만들기
테스트 대상이 되는 Custom Repository 클래스를 만들고 간단한 기능을 구현합니다.
@Repository
public class MemberCustomRepository {
@PersistenceContext
EntityManager entityManager;
public List<MemberEntity> selectAllMember(){
String jpql = """
select m from MemberEntity as m
""";
Query query = entityManager.createQuery(jpql, MemberEntity.class);
return query.getResultList();
}
public void insertSigleMemberEntity(MemberEntity memberEntity){
String jpql = """
insert into
MemberEntity (id, email, name, phoneNumber)
values(:id, :email, :name, :phoneNumber)
""";
Query query = entityManager.createQuery(jpql);
query.setParameter("id", memberEntity.getId());
query.setParameter("name", memberEntity.getName());
query.setParameter("email", memberEntity.getEmail());
query.setParameter("phone", memberEntity.getPhoneNumber());
query.executeUpdate();
}
}
TDD가 추구하는 순서와는 반대가 되었지만 구현한 기능을 테스트하기 위해 코드를 작성합니다.
이 때, EntityManager 객체를 직접 로드하기 위해 @PersistenceContext 어노테이션을 사용합니다.
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class MemberCustomRepositoryTest {
@PersistenceContext
private EntityManager entityManager;
MemberCustomRepository memberCustomRepository;
@BeforeEach
public void setUpRepository(){
if(memberCustomRepository == null)
memberCustomRepository = new MemberCustomRepository();
if(memberCustomRepository.entityManager == null)
memberCustomRepository.entityManager = entityManager;
}
@Test
@DisplayName("select at least one row in member table")
public void select_all_member_entity_test_with_entityManager(){
List<MemberEntity> mList = memberCustomRepository.selectAllMember();
for(MemberEntity member : mList){
System.out.println(member.getName() + ": " + member.getEmail());
}
Assertions.assertThat(mList.size()).isNotEqualTo(0);
}
}
Rollback을 잠시 끄는 방법
소프트웨어 엔지니어가 명심해야 할 것 중 하나로 백업이 있습니다.
만약 회사에서 개발 DB에 붙는 경우라면 ddl-auto 옵션이 정상적으로 꺼져있는지 반드시 확인합시다.
그치만 개발 극초기, 아무런 DB가 없는 제로-베이스라면?
@Rollback(value=false) 어노테이션을 통해 @DataJpaTest 옵션을 끌 수 있습니다.
'Backend > JPA' 카테고리의 다른 글
[JPA] 다대다(N:N) 관계 (0) | 2023.07.03 |
---|---|
[JPA] 프록시 객체의 직관적 이해 (0) | 2023.06.12 |
[JPA] 영속성 컨텍스트 1차 캐시의 주의점 (0) | 2023.06.06 |
[JPA] org.hibernate.PersistentObjectException: detached entity passed to persist 에러 (0) | 2023.06.06 |
[JPA] StackOverflowError (0) | 2023.05.27 |