본문 바로가기

Spring Boot

Spring Data JPA

Spring Data JPA

Spring Framework에서 제공하는 데이터 접근기술

JPA(Java Persistence API)를 기반으로 반복적인 CRUD 코드의 생략과 표준화된 인터페이스를 통해

생산성과 유지보수성을 극대화하는 기술

 

 

Spring 생태계 내에서의 역할

 - Repository 패턴을 통한 데이터 접근 표준화

 - JPA 위에 얹혀서 동작함(JPA가 필수적으로 선행됨)

 - 데이터베이스 접근 계층의 코드량을 줄이고 유지보수 효율성을 증가시킴

Domain\ - > Entity

Domain\Repository\ - > Spring Data JPA

    Domain\Repository\JpaRepository or CrudRepository

Domain\Service - > 핵심 비즈니스 로직

Domain\Controller - > API 제공

구조가 이런식으로 구성되어야한다고 한다..

 

 

Spring Data JPA의 동작구조

1. Repository Interface 작성(인터페이스만 작성하며, 그 복잡한 구현이 필요없다고 한다)

2. Spring Data JPA가 내부적으로 Proxy 객체를 생성함

3. EntityManager를 사용하여 JPA 동작을 위임한다

 

 

JPA와 Spring Data JPA의 관계

Spring Data JPA는 JPA를 더욱 편리하기 사용하기 위한 상위기술이라고 한다.

JPA가 반드시! 선행되어야 하며, 내부적으로 EntityManager를 사용한다고 한다.

  JPA Spring Data JPA
역할 ORM 표준 스펙 JPA 기반 CRUD 기능을 자동화함
구현체 Hibernate  등등.. Spring 프레임워크 제공
코드작성 EntityManager로 '직접' 작성함 Interface로 추상화만 함
주요기능 영속성 관리, Entity 상태 관리 CRUD 자동화, Query Method, 페이징 기능

 

 

 

Spring Data JPA의 주요 기능

기능 설명
JpaRepository 상속 기본 CRUD 메서드 제공(findById, save 등등)
Query Method 메서드 이름으로 쿼리를 자동 생성(findByEmail 등등)
@Query JPQL 작성 기능 (??)
Native Query 실제 DB SQL을 사용할 수 있음
페이징 / 정렬 Pageable, Sort 인터페이스 제공
Projection 일부 컬럼만 조회할 수 있음

 

기본적으로 위와 같은 기능들이 제공된다.

 

예시

* 내 프로젝트에선 아직 프로젝트 설정을 하지 않았기 때문에 강사님께서 제공해주신 예시코드를 참조함

// Repository 선언
public interface MemberRepository extends JpaRepository<Member, Long> {
// 인터페이스이며, extends로 JpaRepository<Member, Long>을 상속받고 있다

	Optional<Member> findByEmail(String email);
    
    @Query("select m from Member as m where m.name = :name") // 기본적인 @Query 애너테이션
	List<Member> findByNameUsingJPQL(@param("name") String name); // @Param을 통해 파라미터를 받음
    
    // value = "쿼리문", nativeQuery 같은 문장들도 @Query 애너테이션에 적을 수 있다
    @Query(value = "select * from members where age >= :age", nativeQuery = true) // Query 애너테이션
    List<Member> findByAgeNative(@Param("age") int age);
} // MemberRepository 끝

// 실제 사용예시
private final MemberRepository memberRepository; // 뭐 이런식으로 불러왔다고 하면
Member member = memberRepository.findByEmail("b1uffer@naver.com")
                                 .orElseThrow(() -> new EntityNotFoundException());
                                 
List<Member> members = memberRepository.findByAgeNative(30);

 

어렵긴 한데 정말 간편하게 쓸 수 있네요잉

 

* 실무에서는 JpaRepository 상속(extends JpaRepository<Member, Long> 등), Query Method 조합으로 대부분 해결가능

* 복잡한 조건같은 경우 @Query 또는 Querydsl로 해결한다고 함

* 성능 튜닝이 필요하다면 Native Query를 사용한다

* 페이징 처리가 필요하면 Pageable, Sort를 적극 활용한다

 

 

정리

JPA : ORM의 표준, 영속성 컨텍스트를 활용함 / 직접 코드 작성을 해야함

Spring Data JPA : 생산성 up, 코드량 down, 유지보수에 용이함 / 복잡한 쿼리는 Querydsl, Native가 필요하다

 

Spring Data JPA는 JPA기반 CRUD를 자동하하고 Repository 패턴을 쉽게 구현할 수 있는 Spring의 표준기술임

유지보수, 생산성에 큰 장점이 있으나 복잡한 쿼리의 경우 별도의 도구(Querydsl, Native 등)와 병행 사용이 필요하다.

'Spring Boot' 카테고리의 다른 글

Spring Data JPA : 구조 이해  (3) 2025.07.23
Spring Data JPA : 프로젝트 설정  (0) 2025.07.22
Entity 설계  (7) 2025.07.22
RESTful 구현 기본 : Controller에서 요청 처리  (1) 2025.07.18
RESTful API 기본 : @RestController  (6) 2025.07.18