[SpringBoot] Repository 계층 단위 테스트는 꼭 진행해야 할까?

이혜성·2025년 2월 12일

SpringBoot

목록 보기
9/9

서론

최근 프로젝트를 진행하면서, 테스트 코드가 숙련되면 직접 스웨거를 키고 데이터를 집어 넣으면서 테스트 하는 것 보다 빠른 속도로 테스트가 가능하다는 이야기를 들었다.
그래서 테스트코드를 작성하며 프로젝트를 진행했지만, Controller, Service, Repository 단위 테스트와 통합 테스트 전부 작성하는 것은 시간적 무리라고 생각했다.
그래서 핵심 기능을 처리하는 서비스 계층에서의 검증과 통합환경에서의 검증이면 충분하다고 생각했다.

문제 발생

해당 도메인에 대한 개발은 한참전에 끝났었고, 최근에 하나의 로직을 수정을 했다.
해당 도메인은 테스트 코드를 짜기 전 스웨거 api 호출로 모든 테스트를 끝낸 도메인이었다.
그런데 분명 의도대로 코드를 다 작성을 했지만, 특정 상황에 원하시는 요청이 오지 않았다.
해당 코드는 전체 게시글을 불러오는 쿼리로, 중간에 차단된 게시글을 빼고 불러오는 쿼리를 추가했다.

    @Query(" SELECT p FROM Post p WHERE p.isDeleted = false AND (:category IS NULL OR p.category = :category) AND (:id IS NULL OR p.id < :id) AND (:postIds IS NULL OR p.id NOT IN :postIds)")
    List<Post> findFilteredPosts(@Param("category") String category, @Param("id") Long id, @Param("postIds") List<Long> postIds, Pageable pageable);

문제 해결

JPA가 자바 객체를 SQL 쿼리로 바꿔주기에 그 변환과정에서 의도한대로 진행이 안될 수가 있었다.
위의 쿼리를 보면 List 속 id의 배열이 들어오는데 배열이 null이라면 해당 조건을 무시하고, 리스트의 값이 있다면, 해당 쿼리를 실행시키는 것이다.
하지만, null이 아닌 빈 리스트가 들어간다면 자바 객체를 SQL 명령어로 변환시키는 과정에서 문제가 생겨버린다. 당연히 빈 리스트이니 null 취급으로 결과가 나올 것으로 예상했지만, 실제론 달랐다.

결론

Repository 계층에서는 쿼리는 정직하기에 발생할 문제가 없다고 생각했었다.
하지만 위와 같은 문제를 겪음으로 정직한 쿼리도 Java 에서 SQL로 변환하는 과정이 완벽할 수는 없다는 것을 알았다.
그럼으로 매우 단순한 save와 같은 쿼리는 테스트를 하지 않아도 괜찮지만, JPQL 같이 사용자가 작성하는 쿼리는 사용자의 의도대로 잘 작동하는지 테스트를 해보는 것이 좋다고 생각한다.

profile
반갑습니다

0개의 댓글