프로그래밍 공부/Spring

JpaRespository가 아닌 Repository를 사용한 이유

Spring Data Jpa의 Repository들

Spring Data JPA를 사용하면 대체로 JpaRepository 인터페이스를 사용하게 된다. 하지만 내부를 살펴보면 더 많은 Repository가 존재한다는 것을 알 수 있다.

  • Repository - 기본적인 Repository이다.
  • CrudRepository - CRUD 기능을 제공한다.
  • PagingAndSortingRepository - 페이지네이션과 sort 기능을 제공한다
  • JpaRepository - 영속성 context를 flush하거나 Batch등의 기능을 선언하지 않고 사용할 수 있다.

이러한 Repository들은 상속관계로 연결되어있어, 결과적으로 JpaRepository는 상위의 모든 Repository가 제공하는 기능들을 제공한다.

 

이는 분명 편리한 기능이지만, 한번 더 생각해본다면, 우리에게 필요하지 않은 메서드들도 제공되고 있다는 뜻을 의미한다. 

그렇다면 이는 과연 장점만 가지고 있을까?

 

 

Repository를 선택한 이유

해당 문제를 처음 고민한 것은 회고덕 프로젝트에서 리팩토링을 진행하는 과정에서였는데, 필요하지 않은 메서드들도 전부 열어주는 것이 맞는가?에 대한 논의에서 시작되었다.

 

JpaRepository는 대략 20개의 메서드를 제공하고 있는데, 해당 메서드 중 실제로 사용하고 있는 것은 4~5개 정도였다. 그러다 보니, 리팩토링 과정에서 실제로는 사용하지 않게 된 메서드를 테스트하고 있는 등의 문제가 발생한 것이다. (컴파일 타임에 확인할 수 없다 보니 알아보는 것이 늦었다.)

 

반면, Repository는 우리가 사용하는 메서드를 반드시 선언해야 하기 때문에 save, delete, update 등 데이터에 변경을 가할 수 있는 메서드를 최소한으로 공개할 수 있다. 이를 통해서 의도하지 않은 메서드가 실행되는 것을 막는 것이다. 

 

JpaRepository를 Repository로 변경하는 리팩토링 과정을 겪으면서 추가적인 이점도 얻게 되었는데, 메서드 호출 방식의 일관화이다. JpaRepository에서 제공하는 delete메서드가 id, 객체 자체등 여러 방식으로 삭제할 수 있도록 제공해주다 보니 삭제 방식에 통일감이 없었는데 겸사겸사 관련 컨벤션을 맞출 수 있었다.

 

정리

이 글은 JpaRepository의 사용이 무조건 나쁘다는 의도로 작성된 것은 아니다. JpaRepository를 사용하는 것은 확실히 편하고, 유연하게 사용할 수 있다는 장점을 가지고 있다. 하지만, 대체로 많은 자료가 JpaRepository를 사용하니까, 라는 이유만으로 JpaRepository를 쓰고 있었다면 Repository를 통해서 메서드를 개발자가 필요한 것들만 열어두는 것 역시 프로젝트의 상황에 맞춰서 고려해보는 것이 좋다고 생각한다. 

 

 

 

참고

https://www.baeldung.com/spring-data-repositories

https://www.youtube.com/watch?v=MMH_ht8pf8U 

'프로그래밍 공부 > Spring' 카테고리의 다른 글

N+1 문제 해결하기  (1) 2022.10.14
스프링 트랜잭션 전파속성  (0) 2022.10.14
[Spring] DB ConnectionPool이란?  (1) 2022.05.25
[Spring] 의존 자동 주입, @AutoWired  (2) 2022.05.07
[Spring] @Component vs @Bean  (4) 2022.05.06