본문 바로가기
Backend/JPA

[JPA] JPQL을 Test 하는 간단한 방법

by Everyday Sustler 2023. 7. 23.
반응형

단일 유형 개체에 대한 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 옵션을 끌 수 있습니다.

 

반응형