[Repository] Spring 버전에 따른 의존 관계 변경

nayu1105·2023년 10월 24일
post-thumbnail

이전에 진행한 프로젝트를 Spring Boot 2.x에서 3.1.0로 버전 업하고 다음과 같은 오류를 발견했다.

오류에서 findById()save() 찾을 수 없다고 했다.

코드를 유심히 보다가 평소에 내가 쓰던 Repository가 아님을 발견했다.

평소 나는 아래와 같이 JpaRepository를 써서 함수를 구현했다.

그러나 문제의 부분은 PagingAndSortingRepository를 상속받고 있었다.

그래서 그 차이점을 들여다보기로 했다.

Repository 상속 관계

IntelliJ에서 다이어그램으로 의존관계를 확인했다.

Repository : 최상의 Repository

PagingRepository : Repository를 상속받고, 페이징과 정렬을 인터페이스

CrudRepository : Repository를 상속받고, crud를 위한 인터페이스

JpaRespository : 페이징, 정렬, crud에 더불어 jpa에 특화된 메서드(flush, Batch)를 제공하는 인터페이스

문제점

CrudRepository에는 save(), findById()가 있는 반면, PagingRepository은 Sort와 Paging이 가능한findAll() 함수만 존재했다.

이 때문에 PagingRepository만 상속받은 Repository가 save(), findById()를 사용하지 못했던 것이다.

해결

PagingRepository의 기능과 CrudRepository 기능을 모두 가져야 했기에 JpaRepository를 상속받도록 변경했다.

변경 한 후 문제가 해결되었다.

원인찾기 및 회고

해당 코드가 Spring 2.x 때는 문제 없었는데 3.x 로 변경하면서 갑자기 오류가 발생했다.

오류에 대해 구글에 PagingRepository 상속 관계를 알아봤더니 다음과 같이 떠서 오류를 찾는데 시간이 걸렸다.

그래서 혹시나 스프링 버전이 바뀌어서 그런가 생각하고 직접 상속관계를 확인해보았다.

3.x 로 세팅 한 후 상속관계를 확인하니 이렇게 떴었는데

2.x 로 세팅을 돌려놓고 상속관계를 확인하니 이렇게 떴다.

이로서 스프링 버전이 바뀌면서 상속관계가 바꼈단 사실을 확인했다.

평소에 당연하게 JpaRepository를 써서 몰랐는데 이번 기회로 구체적인 의존관계까지 공부할 수 있어서 재미있었다.

JpaRepository 보다는 Repository를 사용해서 필요한 메세지만 개방하여 비즈니스 로직에서 유의미한 책임만 두라는 블로그의 글도 읽으면서 무분별한 JpaRepository 남발은 줄이고, sort,paging,crud 모두 필요하거나 jpa에 특화된 기능이 필요할 때 작성해야 겠구나라는 생각도 들었다.

0개의 댓글