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 = ?
이 쿼리를 실행하는 것과 같다. 메서드 이름 규칙에 대한 것은 공식문서에서 확인할 수 있다.
Spring Data JPA :: Spring Data JPA
Oliver Gierke, Thomas Darimont, Christoph Strobl, Mark Paluch, Jay Bryant, Greg Turnquist Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that
docs.spring.io
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 작업 구현
[JPA] JPA와 하이버네이트(Hibernate)
JPA(Java Persistent API) JPA(Java Persistence API) : ORM 기술의 표준 인터페이스 ORM은 객체와 관계형 데이터베이스를 매핑해 주는 기술이며, JPA는 이를 표준화한 것이다. 그러니까, 자바 애플리케이션에서
chaeyami.tistory.com
[OOP] ORM(Object-Relational Mapping)
ORM이란?ORM(Object-Relational Mapping)은 객체 지향 프로그래밍 언어(OOP 언어, Java/C#등)와 관계형 데이터베이스 간의 데이터 변환을 자동으로 처리하는 기술ORM을 사용하면 SQL 쿼리 대신 직관적인 코드로
chaeyami.tistory.com
GitHub 댓글