JPA / Spring Data JPA

2coconut·2025년 7월 16일

Java로 웹 개발을 하다 보면 JPA와 Spring Data JPA라는 용어를 자주 접하게 된다. 둘 다 데이터베이스와 관련된 기술이지만 역할과 위치가 다르다. 오늘은 이 둘의 차이점과 각각의 특징을 명확히 알아보자.

JPA란?

JPA(Java Persistence API)는 Java 진영의 ORM 기술 표준이다. 여기서 중요한 점은 JPA는 특정 라이브러리가 아니라 인터페이스 명세라는 것이다.

JPA의 특징

  • 표준 명세: Java에서 관계형 데이터베이스를 사용하는 방법을 정의
  • 인터페이스 집합: 실제 구현체가 아닌 규약만 제공
  • 구현체 필요: JPA를 사용하려면 이를 구현한 프레임워크가 필요

JPA 구현체들

JPA 명세를 구현한 대표적인 프레임워크들

  • Hibernate: 가장 널리 사용되는 JPA 구현체
  • EclipseLink: Eclipse 재단에서 개발한 구현체
  • OpenJPA: Apache에서 개발한 구현체
// JPA 표준 어노테이션 예시
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "username")
    private String name;
}

JPA의 핵심 구성 요소

1. EntityManager

JPA의 핵심 인터페이스로, 엔티티의 생명주기를 관리한다.

@PersistenceContext
private EntityManager entityManager;

public User findUser(Long id) {
    return entityManager.find(User.class, id);
}

public void saveUser(User user) {
    entityManager.persist(user);
}

2. 영속성 컨텍스트 (Persistence Context)

  • 엔티티 객체들을 관리하는 일종의 캐시
  • 1차 캐시, 변경 감지, 지연 로딩 등의 기능 제공
  • 트랜잭션과 생명주기를 함께 함

3. JPQL (Java Persistence Query Language)

  • 객체지향 쿼리 언어
  • SQL과 유사하지만 테이블이 아닌 엔티티 객체를 대상으로 쿼리 작성

Spring Data JPA란?

Spring Data JPA는 JPA를 더 쉽게 사용할 수 있도록 스프링에서 제공하는 모듈이다. JPA 위에 한 단계 더 추상화된 계층을 제공한다.

Spring Data JPA의 목표

  • 반복적인 코드 제거: CRUD 작업의 보일러플레이트 코드 최소화
  • 개발 생산성 향상: 인터페이스만 정의하면 구현체 자동 생성
  • 일관된 API 제공: 모든 Repository가 동일한 패턴 사용

Repository 인터페이스 계층구조

각 인터페이스의 역할

  • Repository: 마커 인터페이스 (메서드 없음)
  • CrudRepository: 기본 CRUD 메서드 제공
  • PagingAndSortingRepository: 페이징과 정렬 기능 추가
  • JpaRepository: JPA 특화 기능 추가 (배치 처리 등)

JPA vs Spring Data JPA 비교

JPA 방식 (EntityManager 사용)

@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);
    }
}

Spring Data JPA 방식 (Repository 인터페이스)

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);
}

📊 주요 차이점 정리

구분JPASpring Data JPA
정의Java ORM 표준 명세JPA를 쉽게 사용하는 Spring 모듈
성격인터페이스/표준프레임워크/구현체
사용방법EntityManager 직접 사용Repository 인터페이스 사용
코드량상대적으로 많음매우 적음
학습곡선높음낮음
세밀한 제어가능제한적

🏗️ 계층 구조 이해

각 계층의 역할

  • Spring Data JPA: 개발자 편의성 제공, 반복 코드 제거
  • JPA: 표준 명세, 객체-관계 매핑 정의
  • Hibernate: JPA 명세의 실제 구현
  • JDBC: 저수준 데이터베이스 접근
profile
컴공학생

0개의 댓글