Object-Relational Mapping의 약자
객체와 관계형 데이터베이스를 매핑 한다는 뜻이다.
ORM 프레임워크 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결해준다.
ORM을 사용하면, SQL을 작성하지 않아도 직관적인 메소드로 데이터를 조작할 수 있다는 장점이 있다.
Java Persistence API의 약자
자바 진영의 ORM 기술 표준으로, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다

JPA는 애플리케이션과 JDBC 사이에서 동작한다.
개발자가 JPA를 사용하면 JDBC API를 통해 SQL을 호출하여 DB와 통신한다.
즉, 개발자는 JPA의 활용법만 익히면 DB 쿼리 구현없이 데이터베이스를 관리할 수 있다.
JPA 인터페이스를 구현한 대표적인 프레임워크로 하이버네이트(Hibernate)가 있다.
객체 중심 개발 가능
SQL 중심 개발이 이루어진다면, CRUD 작업이 반복해서 이루어져야한다.
하나의 테이블을 생성 시 이에 해당하는 CRUD를 전부 만들어야 하며, 추후에 컬럼이 생성되면 관련 SQL을 모두 수정해야하고, 실수할 가능성도 높다.
생산성 증가
SQL 쿼리를 직접 생성하지 않고, 만들어진 객체에 JPA 메소드를 활용해 이터베이스를 다루기 때문에 편리하다.
jpa.persist(member); // 저장
Member member = jpa.find(memberId); // 조회
유지보수 용이
기존에는 필드 변경시 모든 SQL를 수정해야했다면, JPA는 필드만 변경되면 JPA가 알아서 해주기 때문에 처리해줘야 하는 코드 수가 줄어들어 유지보수에 용이하다.
성능 증가
사람이 직접 SQL을 짜는 것과 비교해서 JPA는 동일한 쿼리에 대한 캐시 기능을 지원해주기 때문에 성능 효율이 높다.
데이터 접근 추상화와 벤더 독립성
데이터베이스 기술에 종속되지 않도록 한다.
데이터베이스를 변경하면 JPA에게 다른 데이터베이스를 사용한다고 알려주면 됨.

Spring framework에서 JPA를 더 쉽고 편리하게 사용할 수 있도록 지원하는 모듈이다.
Spring Data JPA의 목적은 데이터 계층 접근을 위해 필수적으로 생성해야하나, 예상가능하고 반복적인 코드들을 대신 작성해줘서 코드를 줄여주는 것이다.
👉 JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 이루어진다.
Spring Data JPA는 JPA Provider가 아닌 인터페이스이다.
* JPA Provider: JPA 구현체.
Hibernate, EclipseLink, OpenJPA, DataNucleus, TopLink...
Spring Data JPA는 항상 JPA provider가 필요하다.
Spring boot에서는 spring-boot-starter-data-jpa로 패키지를 가져와 사용하며, 이는 Hibernate 프레임워크를 활용한다.
Entity 생성
@Entity
public class Product extends Timestamped {
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private Long id;
private Long userId;
private String title;
private String image;
private String link;
private int lprice;
private int myprice;
}
Repository 생성
public interface ProductRepository extends JpaRepository<Product, Long> {
}
Repository 기본 제공 기능
// 1. 상품 생성
Product product = new Product(...);
productRepository.save(product);
// 2. 상품 전체 조회
List<Product> products = productRepository.findAll();
// 3. 상품 전체 개수 조회
long count = productRepository.count();
// 4. 상품 삭제
productRepository.delete(product);
추가기능
interface 만 선언해 주면 구현은 Spring Data JPA가 대신한다.
public interface ProductRepository extends JpaRepository<Product, Long> {
// (1) 회원 ID 로 등록된 상품들 조회
List<Product> findAllByUserId(Long userId);
// (2) 상품명이 title 인 관심상품 1개 조회
Product findByTitle(String title);
// (3) 상품명에 word 가 포함된 모든 상품들 조회
List<Product> findAllByTitleContaining(String word);
// (4) 최저가가 fromPrice ~ toPrice 인 모든 상품들을 조회
List<Product> findAllByLpriceBetween(int fromPrice, int toPrice);
}
JPA는 복잡한 쿼리보다는 실시간 쿼리에 최적화되어있다.
Ex) 통계 처리와 같은 복잡한 작업이 필요한 경우에는 기존의 Mybatis와 같은 Mapper 방식이 더 효율적일 수 있다.
💡 Spring에서는 JPA와 Mybatis를 같이 사용할 수 있기 때문에 상황에 맞는 방식을 택하여 개발하면 된다.