스프링 데이터 JPA 는 스프링 프레임워크와 JPA 를 함께 사용할 때, JPA 를 보다 편리하게 사용할 수 있게 해주는 기술이다.
예를 들어, 순수 JPA 만을 사용해서 User(회원) 에 대한 (조회/등록/수정/삭제) 등을 처리하기 위해서는 다음과 같이 리포지토리를 작성해야 할 것이다.
@Repository
public class UserRepository {
@PersistenceContext
private EntityManager em;
public User save(User user) {
em.persist(user);
return user;
}
public void delete(User user) {
em.remove(user);
}
public List<User> findAll() {
return em.createQuery("select u from User u", User.class).getResultList();
}
public Optional<User> findById(Long id) {
User user = em.find(User.class, id);
return Optional.ofNullable(user);
}
public long count() {
return em.createQuery("select count(u) from User u", Long.class).getSingleResult();
}
public User find(Long id) {
return em.find(User.class, id);
}
}
만약에 여기에 더해서, Goods(상품)
에 대한 (조회/등록/수정/삭제) 기능을 처리하기 위한 리포지토리도 만든다고 가정해보자.
그러면 사실상 위 UserRepository
코드에서 User(회원)
-> Goods(상품)
으로의 변경 외에 나머지 코드는 사실상 거의 같은 클래스가 생성될 것이다.
스프링 데이터 JPA 는 이러한 중복되는 부분에 대한 불편함을 해소하고, 다양한 편의 기능을 제공한다. ( 이 부분은 뒤에서 살펴보도록 하자. )
위 코드를 스프링 데이터 JPA 를 사용해서 구현해보면 다음과 같다.
public interface UserRepository extends JpaRepository<User, Long> {
}
해당 도메인에 대한 인터페이스를 생성하고, JpaRepository<엔티티, 엔티티ID>
만 인터페이스 상속받으면 모든 작업이 끝난다. 그러면 해당 도메인에 대한 기본적인 (조회/등록/수정/삭제) 기능을 넘어 다양한 부가 기능을 사용할 수 있게된다.
스프링 데이터 JPA 는 어떻게 이것을 가능하게 하는걸까?
스프링 데이터 JPA 가 어떻게 동작하는지 알아보고, 제공되는 편의 기능에 대해서도 하나씩 알아보자.
강의를 듣고 정리한 글입니다. 코드와 그림 등의 출처는 김영한 강사님께 있습니다.