> For the complete documentation index, see [llms.txt](https://incheol-jung.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://incheol-jung.gitbook.io/docs/study/jpa/2-jpa.md).

# 2장 JPA 시작

### 데이터베이스 방언

`JPA`는 특정 데이터베이스에 종속적이지 않은 기술이다.\*\* 따라서 다른 데이터베이스로 손쉽게 교체할 수 있다.

{% hint style="info" %}

#### 데이터베이스 마다 어떤 부분이 다를까?

데이터 타입 : 가변 문자 타입으로 `MySQL`은 `VARCHAR`, `오라클`은 `VARCHAR2`를 사용한다.

다른 함수명 : 문자열을 자르는 함수로 `SQL` 표준은 `SUBSTRING()`을 사용하지만 `오라클`은 `SUBSTER()`을 사용한다.

페이징 처리 : `MySQL`은 `LIMIT`를 사용하지만 `오라클`은 `ROWNUM`을 사용한다.
{% endhint %}

이처럼 `SQL` 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능을 `JPA`에서는 `방언(Dialect)`이라 한다.

개발자는 JPA가 제공하는 표준 문법에 맞추어 JPA를 사용하면 되고, 특정 데이터베이스에 의존적인 SQL은 데이터베이스 방언이 처리해준다.

![](/files/-M5HoKOVZpEY43KD3JaZ)

### 엔티티 매니저 설정

#### 엔티티 매니저 팩토리 생성

JPA를 시작하려면 우선 `persistence.xml`의 설정 정보를 사용해서 엔티티 매니저 팩토리를 생성해야 한다. 이때 `Persistence` 클래스를 사용하는데 이 클래스는 엔티티 매니저 팩토리를 생성해서 JPA를 사용할 수 있게 준비한다.

```
EntityManagerFactory emf = 
	Persistence.createEntityManagerFactory("jpabook");
```

**`엔티티 매니저 팩토리`는 애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 한다.**

#### 엔티티 매니저 생성

```
EntityManger em = emf.createEntityManager();
```

`엔티티 매니저`를 사용해서 엔티티를 데이터베이스에 등록/수정/삭제/조회할 수 있다. **참고로 엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 `스레드`간에 공유하거나 재사용하면 안 된다.**

#### 트랜잭션 관리

JPA를 사용하면 항상 트랜잭션 안에서 데이터를 변경해야 한다. `트랜잭션` 없이 데이터를 변경하면 예외가 발생한다.

### JPQL

하나 이상의 회원 목록을 조회하는 다음 코드를 살펴보자

```
//목록 조회
TypedQuery<Member> query = 
	em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
```

* `JPQL`은 엔티티 객체를 대상으로 쿼리한다. 쉽게 이야기해서 클래스와 필드를 대상으로 쿼리한다.
* `SQL`은 데이터베이스 테이블을 대상으로 쿼리한다.

JPQL은 데이터베이스 테이블을 전혀 알지 못하고 엔티티 객체를 참조한다.

### 정리

`JPA`가 반복적인 `JDBC API`와 결과 값 매핑을 처리해준 덕분에 코드량이 상당히 많이 줄어든 것은 물론이고 심지어 SQL도 작성할 필요가 없었다. 하지만 코드량을 줄이고 SQL을 자동 생성하는 것은 JPA가 제공하는 전체 기능 중 일부에 불과하다.
