※ 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 → 생산성 높고 유지보수성 향상
'Java > 참고자료' 카테고리의 다른 글
[Java] javax.annotation.Resource 오류 (1) | 2025.01.17 |
---|---|
[Java] Date & LocalDate & LocalDateTime 변수를 yyyyMMdd 문자열로 변환 (0) | 2024.09.13 |
[Java] 특정 문자열 및 빈 값 체크 (0) | 2024.08.29 |
[Java] Annotation (0) | 2023.08.15 |
[Java] Equals & HashCode (0) | 2022.11.25 |