이전에는 MemoryRepository 인터페이스를 생성하고, implement 하여 구현체를 생성하여 DB 혹은 Persistence Context에 CRUD를 수행하였다. JPA를 사용하더라도 인터페이스인 JPA를 위한 구현체인 hibernate 라이브러리를 추가해줬어야 했다.
하지만 Spring에서는 굳이 구현체를 만들지 않고 인터페이스만으로 기본적인 CRUD 기능을 제공한다. 인터페이스만 작성하면 실행 시점에 스프링 데이터 JPA가 구현 객체를 동적으로 생성하여 주입한다. 하단의 코드와 같다. findByName 메서드만을 제외하고 따로 메서드를 생성하지 않았다. 어떻게 이게 가능할까?
...
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
// JPQL select m from Member m where m.name = ?
@Override
Optional<Member> findByName(String name);
}
임포트된 JpaRepository를 타고 들어가면 보이는 코드이다.
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
/*
* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#findAll()
*/
@Override
List<T> findAll();
/*
* (non-Javadoc)
* @see org.springframework.data.repository.PagingAndSortingRepository#findAll(org.springframework.data.domain.Sort)
*/
@Override
List<T> findAll(Sort sort);
... other methods
}
Spring Data JPA는 개발자가 JPA를 더 쉽게 사용할 수 있도록 도와준다. JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 이루어진다.
사용자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.
다음은 Spring Data JPA, JPA, Hibernate의 전반적인 개념을 정리한 모 블로그의 이미지이다.
출처
https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/
https://www.inflearn.com/course/스프링-입문-스프링부트
'🌱 Spring > 회원 관리 예제' 카테고리의 다른 글
[Spring] JPA (0) | 2023.07.08 |
---|---|
[Spring] 통합 테스트 (0) | 2023.07.07 |
[Spring] 웹 UI 및 비즈니스 로직(가입, 조회) 연결 (0) | 2023.07.05 |
[Spring] Spring Bean과 의존 관계 (0) | 2023.07.05 |
[Spring] 회원 서비스 테스트(Dependency Injection) (0) | 2023.07.05 |