Spring Data JPA 는 Spring 프레임워크에서 JPA를 더욱 쉽게 사용할 수 있도록 지원하는 모듈이다.
이전 JPA/Hibernate에 대해 알아볼 때, EntityManager를 주입받아 사용했다.
그러나 Spring Data JPA는 Repository 인터페이스를 통해 JPA를 추상화한다. 즉, Repository 인터페이스를 정의하면 이를 구현해 사용할 때 Spring Data JPA가 자동으로 JPA의 구현체를 생성한다는 거다.
그래서 JPA 구현체(Hibernate등)을 따로 사용할 필요가 없다.
주요 특징/장점
- Repository 인터페이스 제공 : 기본적인 CRUD 작업 쉽게 구현 -> 생산성 향상
- 쿼리 메서드 기능
- 메서드 이름 규칙을 따르면 별도의 쿼리 작성 없이도 필요한 쿼리를 자동으로 생성해준다.
- Pageable 인터페이스 : 페이징 처리를 위한 인터페이스 제공
- Auditing 기능: 엔티티의 생성 및 수정 시간을 자동으로 관리
- Projections : 엔티티의 일부 필드만 조회
- 데이터베이스 독립성 : JPA와 마찬가지로 데이터베이스에 독립적이므로 데이터베이스 변경 시 코드 수정 최소화
- 테스트 용이성: 단위 테스트 작성이 용이 / 통합 테스트 시에도 메모리 데이터베이스 사용 가능
Spring Data JPA 사용하기
위 특징들을 사용 예시를 통해 알아보자.
1. 의존성 추가
Spring Boot 프로젝트에 spring-boot-starter-data-jpa
의존성을 추가한다.
// gradle 사용시
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
2. Repository 인터페이스 생성
JPA 엔티티에 대한 Repository
인터페이스를 생성한다. 만약 Member
라는 엔티티라면,
public interface MemberRepository extends JpaRepository<Member, Long> {
}
3. 쿼리 메서드 정의
위에서 메서드 이름 규칙을 따르면 별도의 쿼리 작성 없이도 필요한 쿼리를 자동으로 생성해준다고 했다. 필요한 쿼리 메서드를 Repository
인터페이스에 정의함으로써 이를 사용할 수 있다는 말이다.
예를 들어서, Member
엔티티에 Name
이라는 필드가 있다면, 위에 생성한 리포지토리에서
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findAllByName(String name);
}
findAllByName
이라는 메서드를 작성한다. 이는 Member
테이블에서 파라미터에 들어간 값을 Name
에서 찾는 쿼리를 자동으로 실행한다. 즉,
SELECT * FROM Member WHERE name = ?
이 쿼리를 실행하는 것과 같다. 메서드 이름 규칙에 대한 것은 공식문서에서 확인할 수 있다.
4. 서비스 계층 구현
비즈니스 로직을 서비스 계층에 구현하고, Repository
인터페이스를 주입받아 사용한다.
Member
테이블에 대한 비즈니스 로직을 작성한다면 MemberService
클래스를 구현할 거고, 여기서 memberRepository
를 주입하면 기본적인 CRUD 작업을 쉽게 할 수 있다.
@Service
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
// 데이터 저장(Create)
public void createMember(String name) {
Member member = new Member(name);
memberRepository.save(member);
}
// 조회 (Read)
public List<Member> findAllByName(String name) {
return memberRepository.findAllByName(name);
}
}
또한 서비스 메서드에 @Transaction
어노테이션을 사용하면 이 트랜잭션 영역들을 관리할 수도 있다.
참고 : JPA, Hibernate, Spring Data JPA의 차이
- JPA
- 자바 언어에서 ORM 사용(객체와 관계형 데이터베이스 간의 매핑)을 위한 표준 API
- 인터페이스와 어노테이션의 집합으로, 자바 애플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의
- JPA는 구현체가 필요한 명세이며, Hibernate, EclipseLink, DataNucleus 등 사용
- Hibernate
- JPA를 구현한 대표적인 ORM(Object-Relational Mapping) 프레임워크
- JPA 표준을 준수하면서 객체와 관계형 데이터베이스 간의 매핑을 제공
- JDBC API를 내부적으로 사용하여 데이터베이스 연결과 쿼리 실행을 처리
- Spring Data JPA
- JPA 가 ORM 사용을 위한 인터페이스라면, Spring Data JPA는 JPA를 더 쉽게 사용할 수 있도록 추상화한 스프링 프레임워크의 모듈
- JPA 리포지토리 인터페이스를 제공하여 기본적인 CRUD 작업 구현
GitHub 댓글