Java로 웹 개발을 하다 보면 JPA와 Spring Data JPA라는 용어를 자주 접하게 된다. 둘 다 데이터베이스와 관련된 기술이지만 역할과 위치가 다르다. 오늘은 이 둘의 차이점과 각각의 특징을 명확히 알아보자.
JPA(Java Persistence API)는 Java 진영의 ORM 기술 표준이다. 여기서 중요한 점은 JPA는 특정 라이브러리가 아니라 인터페이스 명세라는 것이다.
JPA 명세를 구현한 대표적인 프레임워크들
// JPA 표준 어노테이션 예시
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username")
private String name;
}
JPA의 핵심 인터페이스로, 엔티티의 생명주기를 관리한다.
@PersistenceContext
private EntityManager entityManager;
public User findUser(Long id) {
return entityManager.find(User.class, id);
}
public void saveUser(User user) {
entityManager.persist(user);
}
Spring Data JPA는 JPA를 더 쉽게 사용할 수 있도록 스프링에서 제공하는 모듈이다. JPA 위에 한 단계 더 추상화된 계층을 제공한다.

@Repository
@Transactional
public class UserRepositoryImpl {
@PersistenceContext
private EntityManager entityManager;
public User save(User user) {
if (user.getId() == null) {
entityManager.persist(user);
return user;
} else {
return entityManager.merge(user);
}
}
public User findById(Long id) {
return entityManager.find(User.class, id);
}
public List<User> findAll() {
return entityManager.createQuery("SELECT u FROM User u", User.class)
.getResultList();
}
public void delete(User user) {
entityManager.remove(user);
}
}
public interface UserRepository extends JpaRepository<User, Long> {
// 기본 CRUD 메서드들이 자동으로 제공됨
// save(), findById(), findAll(), delete() 등
// 메서드 이름으로 쿼리 자동 생성
List<User> findByName(String name);
List<User> findByAgeGreaterThan(int age);
// 직접 쿼리 작성
@Query("SELECT u FROM User u WHERE u.email = ?1")
User findByEmail(String email);
}
| 구분 | JPA | Spring Data JPA |
|---|---|---|
| 정의 | Java ORM 표준 명세 | JPA를 쉽게 사용하는 Spring 모듈 |
| 성격 | 인터페이스/표준 | 프레임워크/구현체 |
| 사용방법 | EntityManager 직접 사용 | Repository 인터페이스 사용 |
| 코드량 | 상대적으로 많음 | 매우 적음 |
| 학습곡선 | 높음 | 낮음 |
| 세밀한 제어 | 가능 | 제한적 |
