자바 진영의 ORM 기술 표준이다.
개발자가 JDBC API 를 직접 썼다면, JPA 가 이걸 대신 해준다.
예를 들어, 멤버 객체를 저장한다고 가정해보자.

조회
find(id) 처럼 멤버 아이디에 대한 정보를 찾아달라고 하면 JPA 가 멤버 객체를 분석해서 select 쿼리를 만들고, JDBC API 를 사용하고, ResultSet 까지 매핑하고 패러다임의 불일치까지 해결해준다. 그 다음 Entity object 를 만들어서 반환 해준다.
EJB 엔티티 빈은 복잡하고 성능도 좋지 않아서 개발자들이 많이 사용하지 않았다.
그래서 Gavin King 과 많은 개발자들이 함께 만든 Hibernate 라는 오픈 소스가 생겼다.
Java 에서 표준 ORM 명세를 Hibernate 를 기반으로 만들게 되었고, 이것이 JPA 이다. 표준이라 함은 여러 사람의 의견을 모아서 만들기 때문에 용어가 더 명확하게 정제된다.
표준 명세는 인터페이스의 모음이다. 대표적인 구현체는 3가지 정도가 있는데, 거의 80% 이상은 구현체로 Hibernate 를 쓴다.
즉, 우리는 JPA 표준 인터페이스에 Hibernate 구현체를 쓴다.
데이터 접근 추상화와 벤더 독립성
기술 표준이다.
SQL 중심적인 개발에서 객체 중심으로 개발할 수 있다. (우리는 마치 자바 컬렉션에 객체를 저장하듯이 하면 된다.)
생산성이 향상된다.
// 저장
jpa.persist(member)
// 조회
Member member = jpa.find(memberId)
// 수정
member.setName("변경할 이름")
// 삭제
jpa.remove(member)
유지보수가 향상된다.
패러다임의 불일치를 해결해준다.





성능이 좋아진다.
같은 데이터베이스 트랜잭션 안에서는 같은 엔티티를 반환한다. → 약간의 조회 성능 향상
트랜잭션을 커밋할 때까지 insert SQL 을 모은다. JDBC 의 Batch SQL 기능을 사용해서 한 번에 SQL 을 네트워크로 보낸다. 네트워크 통신 비용이 줄어든다.지연 로딩 : 객체가 실제 사용될 때 로딩
즉시 로딩 : JOIN SQL 로 한 번에 연관된 객체까지 미리 조회
예를 들어, member 를 조회할 때 team 을 거의 안쓴다면 member 만 조회하는 것이 성능상 낫다. 이 때 지연 로딩 전략이 동작한다.
member 를 조회할 때 team을 무조건 같이 쓴다면 JPA 에 세팅해놓으면 즉시 로딩 전략이 동작한다.
이 글은 김영한 강사님의 '자바 ORM 표준 JPA 프로그래밍' 강의를 들으며 작성하였습니다.