JPA에 대해서 알기전에 기본이 되는 ORM에 대해서 알아야 한다.
ORM : 객체는 객체대로 설계하고, RDB(관계형 데이터베이스)는 RDB 대로 설계한다.
프레임워크로 객체와 RDB 를 중간에서 서로 매핑해주는 역할을 담당한다.
대중적인 언어에는 대부분 ORM 기술이 존재한다.
ORM
DB 테이블을 Java 객체로 Mapping(매핑)함으로써 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성(객체를 통해 간접적으로 디비 데이터를 조작)
DB 데이터 ← Mapping → Object 필드
SQL 쿼리가 아니라 메서드로 데이터를 조작
객체간 관계를 바탕으로 SQL 을 자동으로 생성
SQL Mapper
SQL 을 직접 명시(SQL 문으로 직접 디비를 조작)
SQL ← Mapping → Object 필드
ORM은 RDB의 관계를 Object 에 반영하는 것이 목적이라면, SQL Mapper 는 단순히 필드를 매핑시키는 것이 목적이라는 차이점이 있다.
Java 진영에서의 ORM 기술 표준으로, Java Application 에서 RDB를 사용하는 방식을 정의한 인터페이스의 모음이다.
즉, 실제로 동작하는 것이 아닌 인터페이스를 구현하여 사용해야 한다.(대표적으로 Hibernate)
JPA 2.1 표준 명세를 구현한 3가지 구현체가 있다.
SQL 작성없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주는 기술로 Application 과 JDBC 사이에서 동작한다.
1) 반복적인 코드의 작성
2) SQL 의존적 개발
3) 패러다임의 불일치
장점
생산성
유지보수
패러다임의 불일치 해결
성능
데이터 접근 추상화와 벤더 독립성
단점
학습 곡선이 높다.
속도 저하 가능성이 있다.

JPA 는 어플리케이션과 JDBC API 사이에서 동작한다.
개발자가 JPA 를 사용하면, JPA 내부에서는 JDBC API 를 사용하여 SQL 을 생성하여 DB와 통신한다.
간단하게 JPA 에서의 CRUD 메소드는 아래와 같다.
jpaEm.persist(member); // 저장
jpaEm.find(memberId); // 조회
jpaEm.remove(member); // 삭제
// 수정(조회 이후 해당 객체에 변경하면 DB에도 변경된다.)
// 영속성 컨텍스트
Member member = jpaEm.find(memberId);
member.setName("변경할 이름");

Member 를 저장할 때, JPA는 아래와 같이 동작한다.

Member 를 조회할 때, JPA는 아래와 같이 동작한다.
쿼리를 JPA가 만들어 주기 때문에 Object와 RDB 간의 패러다임 불일치를 해결할 수 있다.
| 어노테이션 | 설명 |
|---|---|
| @Entity | 데이터베이스의 테이블과 일대일로 매칭되는 객체 단위이며, 클래스를 테이블과 매핑한다고 JPA 에게 알린다. |
| @Table | @Entity 선언된 클래스에 매핑할 테이블정보(테이블이름)을 알려준다. 이 어노테이션이 생략되면 클래스이름을 테이블이름으로 매핑한다. |
| @Column | 데이터베이스의 테이블에 있는 컬럼에 필드(변수)를 매핑한다. 별다른 옵션을 설정하지 않는다면 기본적으로는 생략 가능하다. |
| @Id | @Entity 선언된 클래스의 필드를 테이블의 기본키(Primary Key)에 매핑한다. |
| @GeneratedValue | 새로운 레코드가 생성될 때마다 마지막 PK 값에서 자동으로 +1 을 해줘야 하는 auto increment 컬럼인 것을 알려준다. |
| @EmbeddedId | 복합키로서 정의된 값을 정의하고자 할 때 사용한다. |
| @Enumerated | Java 의 Enum 형태로 되어 있는 미리 정의되어 있는 코드 값이나 구분값을 데이터 타입으로 사용할 때 사용한다. |
| @Transient | Entity 객체에 속성으로 지정되어 있지만, 데이터베이스 에서는 필요없는 속성일 때 사용한다. |
해당 속성을 데이터베이스에서 이용하지 않겠다라는 정의이다.
Entity 객체에 임시로 값을 담는 용도로 사용한다.|
아래 사진은 위의 내용을 요약하며 JPA, Hibernate, Spring Data JPA 의 전반적인 개념을 그림으로 표현한 것이다.
JPA와 Spring Data JPA는 똑같이 JPA가 들어가서 처음 접할 때 JPA라고 말하면 Spring Data JPA라고 생각할 수 있는데, 다른 개념이기 때문에 헷갈리면 안 된다.

JPA (Java Persistence API)는 Java EE (Enterprise Edition) 플랫폼에서 제공하는 API로, Java 객체와 관계형 데이터베이스 테이블 간의 매핑을 관리하는 표준 ORM (Object-Relational Mapping) 기술이며, Spring Data JPA 는 JPA를 쉽게 사용하기 위해 스프링에서 제공하는 프레임워크이다.
추상화 정도는 Spring Data JPA > Hibernate > JPA 이다.
Hibernate를 쓰는 것과 Spring Data JPA를 쓰는 것 사이에는 큰 차이가 없지만 아래와 같은 이유로 Spring Data JPA를 사용하는 것이 더 좋을 수 있다.