[Spring Data JPA] 개요
Spring Data JPA
Spring Data JPA는 data commons와 data jpa로 이루어져 있다. ORM이므로 DB 종류에 따라 특화된 구현체가 따로 있고 Spring Data JPA는 즉 JPA에 관련된 인터페이스들을 모아놓은 것이다. JPA이외에도 Redis, mongoDB 등의 패키지가 있다.
공통 인터페이스 상속 구조
Spring Data JPA에서는 JpaRepository를 extends하여 공통 인터페이스를 작성할 수 있도록 하는데 이는 org.springframework.data.jpa 패키지에 소속된 인터페이스이다. 또한, JpaRepository가 상속 받는 인터페이스들은 org.springframework.data:spring-data-commons에 소속된 인터페이스들로 DB에 따라 변경할 수 있도록 다형성에 맞게 작성되어있음을 알 수 있다.
Spring에서 JPA 어노테이션은 Spring이 컴포넌트 스캔이 가능하도록 만들 수 있을 뿐더러 JPA의 예외를 Spring에서 공통적으로 처리할 수 있도록 만들어주는 역할 또한 한다. 하지만 앞서 공통 인터페이스는 JpaRepository를 상속받아 사용한다고 언급하였는데 따라서 기존 JPA 기반의 Repository와는 달리 어노테이션을 작성하지 않는다. 그 이유는 상속받는 인터페이스에 이미 컴포넌트 스캔에 대한 어노테이션이 작성되어있기 때문이다.
실제로 Spring에 의해 공통 인터페이스가 사용될 때는 개발자가 직접 만든 구현체가 없으므로 `com.sun.proxy.$ProxyXXX`라는 이름의 Proxy 객체가 구현되어 사용되게 된다.
Spring Data JPA는 이 공통 인터페이스를 통해 JPA 기반에서 작성했던 거의 모든 공통 기능들을 미리 인터페이스에 작성해놓았고 도메인 별로 특화된 기능은 QueryMethod 등과 같은 방법을 통해서 필요한 메서드를 추가하여 사용할 수 있도록 만들어져 있다.