※ JPA vs Spring Data JPA

// 순수 JPA
Optional<Member> m1 = memberJpaRepository.findById(1L); // 1L은 ID가 1, 타입은 Long을 의미
List<Member> actives1 = memberJpaRepository.findAllByStatus(Member.Status.ACTIVE);

// Spring Data JPA
Member m2 = memberRepository.findById(1L) // 1L은 ID가 1, 타입은 Long을 의미
              .orElseThrow(() -> new IllegalArgumentException("not found"));
List<Member> actives2 = memberRepository.findAllByStatus(Member.Status.ACTIVE);

 

※ JPA vs Spring Data JPA 비교 표

구분 순수 JPA (EntityManager) Spring Data JPA
소속 JPA 표준 API (자바 ORM 표준) JPA 기반의 스프링 모듈 (확장/편의 기능 제공)
단건 조회 메서드 em.find(Entity.class, pk) findById(pk)
반환 타입 엔티티 객체 (없으면 null) Optional<T> (없으면 Optional.empty())
null 처리 개발자가 직접 null 체크 Optional API로 null-safe 처리
쿼리 작성 방식 JPQL 직접 작성 필요 메서드 이름 기반 자동 생성 or @Query 사용
CRUD 기본 제공 없음 (직접 구현) save, findAll, deleteById 등 기본 CRUD 제공
페이징/정렬 JPQL로 직접 구현 Pageable, Sort 등 내장 지원
트랜잭션 관리 직접 제어 or 스프링 @Transactional 사용 동일 (스프링 @Transactional 사용)
코드량 비교적 많음 (보일러플레이트 존재) 간결 (리포지토리 인터페이스만 선언해도 사용 가능)
유연성 매우 높음 (JPA 모든 기능 직접 제어 가능) 편의성 높음, 하지만 일부 세밀 제어는 한계
학습 난이도 다소 높음 (JPA 문법과 JPQL 숙지 필요) 상대적으로 낮음 (자동화된 기능 덕분)

* 보일러플레이트 : 필수지만 매번 반복적으로 작성해야 하는 형식적인 코드

 

※ Spring Data JPA가 생산성을 높이는 3가지 핵심 이유

1) 트랜잭션과 EntityManager 자동 관리

· 순수 JPA에서는 EntityManager 생성, 트랜잭션 시작·종료, 예외 처리 등을 매번 작성해야 함
· Spring Data JPA는 스프링이 자동으로 주입하고, @Transactional로 트랜잭션을 간단하게 처리


2) 쿼리 자동 생성
· 순수 JPA는 JPQL을 직접 작성해야 함

· Spring Data JPA는 메서드 이름 기반으로 쿼리를 자동 생성

    · 예 : findAllByStatus(Status.ACTIVE) → select m from Member m where m.status = ? 자동 생성
· 필요하면 @Query로 직접 JPQL 또는 네이티브 쿼리 작성도 가능


3) 기본 CRUD와 페이징·정렬 내장

· save, findById, findAll, deleteById 같은 CRUD 메서드가 기본 제공
· Pageable, Sort를 활용한 페이징과 정렬 기능도 내장되어 있어 추가 구현이 필요 없음

 

※ 결론

Spring Data JPA는 순수 JPA의 복잡한 보일러플레이트 코드를 최소화하여, 개발자가 비즈니스 로직에만 집중할 수 있도록 도와줌

· 순수 JPA → 유연하지만 반복 코드 많음

· Spring Data JPA → 생산성 높고 유지보수성 향상

+ Recent posts