JPA(Java Persistence API)는 자바 진영의 ORM 기술에 대한 API 표준 명세이다.
객체와 데이터베이스간의 관계를 편리하게 이어준다.
Spring Data JPA는 스프링에서 제공하는 데이터 액세스 기술 중 하나로, 객체 관계 매핑(Object-Relational Mapping, ORM)을 지원한다.
JPA(Java Persistence API)의 표준을 따르며, 데이터베이스와 자바 객체 간의 매핑을 간소화하고 일관성 있게 처리한다.
엔티티 매핑: 자바 객체와 데이터베이스 테이블 간의 매핑을 어노테이션을 통해 간편하게 설정할 수 있다.
CRUD 작업: 데이터베이스의 Create, Read, Update, Delete 작업을 자동으로 지원하여 개발자가 반복적인 코드를 최소화한다.
Query Methods: 메서드 이름을 통한 쿼리 생성을 지원하여 간편한 데이터 검색이 가능하다.
JpaRepository 인터페이스를 확장함으로써 기본적인 CRUD 작업을 자동으로 제공받을 수 있다.
추가적으로 정의한 메서드 이름에 따라 쿼리가 자동으로 생성되어 사용자 정의 쿼리를 최소화할 수 있다.
생산성 향상
스프링 부트의 자동 설정과 스타터 패키지, Spring Data JPA의 간소화된 데이터 액세스 작업으로 개발 생산성이 향상된다.
일관된 코드
JPA를 통한 객체 관계 매핑과 Spring Data JPA의 통합으로 일관된 코드 작성이 가능하며, 유지보수가 용이하다.
데이터베이스 독립성
데이터베이스에 대한 세부적인 설정을 하지 않아도 되며, 다양한 데이터베이스를 쉽게 변경할 수 있다.
스프링 부트의 간편한 설정과 Spring Data JPA의 객체 관계 매핑을 통해 개발자들은 복잡한 데이터 액세스 작업을 간소화하고 일관된 코드를 작성할 수 있다. 빠른 개발 주기와 유지보수의 편의성을 제공하여 현대적인 웹 애플리케이션 개발이 가능하다.
Spring Data JPA에서 데이터 액세스 레이어를 추상화한 Repository 인터페이스를 제공한다. JpaRepository 인터페이스를 확장함으로써 기본적인 CRUD 작업을 자동으로 수행할 수 있다.
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByLastName(String lastName);
}
UserRepository는 JpaRepository를 상속받아 자동으로 CRUD 메서드를 제공받으면서, 추가적으로 메서드 이름을 통한 쿼리(findByLastName)를 정의한다.
Spring Data JPA는 @Query 어노테이션을 통해 개발자가 직접 JPQL(Querydsl)이나 네이티브 쿼리를 작성한다.
@Query("SELECT u FROM User u WHERE u.email = :email")
User findByEmail(@Param("email") String email);
@NamedQuery를 통해 이름 있는 쿼리를 정의하여 사용한다.
@Entity
@NamedQuery(name = "User.findByFirstName", query = "SELECT u FROM User u WHERE u.firstName = ?1")
public class User {
//...
}
JPA는 쓰기 지연(write-behind)과 더티 체킹(dirty checking)을 통해 효율적인 데이터베이스 변경을 지원한다.
변경 감지 메커니즘을 활용하여 객체 상태의 변화를 추적하고, 트랜잭션 커밋 시점에 변경된 부분만 데이터베이스에 반영한다.
// 변경된 필드만 지정
user.setLastName("NewLastName");
// 트랜잭션 커밋 시점에 변경된 필드만 데이터베이스에 반영
Spring Data JPA는 감사(Auditing)를 지원하여 엔티티의 생성일, 수정일, 생성자, 수정자 등의 정보를 자동으로 관리할 수 있다.
@CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy 어노테이션을 통해 이러한 정보를 엔티티에 추가할 수 있다.
@Entity
@EntityListeners(AuditingEntityListener.class)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
//...
}
Spring Data JPA는 페이징과 정렬을 지원하여 대량의 데이터를 효율적으로 처리할 수 있다.
Pageable 인터페이스를 통해 페이징 및 정렬 옵션을 적용할 수 있다.
// 페이징 및 정렬 적용
Page<User> findByLastName(String lastName, Pageable pageable);