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

# Hello JPA 애플리케이션 개발

JPA는 영속성(Persistence)에서 시작한다!\
persistence.xml에서 설정 정보 조회하고, EntityManagerFactory와 EntityManager 생성한다.

![JPA 구동 방식](/files/-MeUcDTRt_mDZaKUV6HU)

실습\
객체와 테이블을 생성하고 매핑해보기!

1. 회원 등록
2. 회원 조회
3. 회원 수정
4. 회원 삭제

&#x20; 1\.  회원 등록

```java
package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try {
            Member member = new Member();
            member.setId(2L);
            member.setName("HelloB");

            em.persist(member);
            tx.commit();
        } catch (Exception e){
            tx.rollback();
        } finally {
            em.close();//em이 결국 DB 연결을 담당하기 때문에 작업 끝나면 닫아줘야한다!!
        }
        emf.close();

    }
}

```

&#x20; 2\. 회원 조회

```java
...
        try {
            Member findMember = em.find(Member.class, 1L);
            System.out.println("findMember.id = " + findMember.getId());
            System.out.println("findMember.name = " + findMember.getName());
            tx.commit();
        } catch (Exception e){
            tx.rollback();
        } finally {
            em.close();//em이 결국 DB 연결을 담당하기 때문에 작업 끝나면 닫아줘야한다!!
        }
        emf.close();

    }
}
```

![회원 조회 결과](/files/-MeUR3KMEWXaIBK3I_r-)

&#x20; 3\. 회원 수정⭐️⭐️⭐️⭐️⭐️\
자바 컬렉션에 데이터를 수정하듯이 setter인 setName()로 바꿀 값을 넣어주면 em.persist(..)할 필요없이 DB에도 수정되있다! \
왜냐하면 JPA를 통해서 엔티티를 가져오면 JPA에서 관리하기 때문에 변경이 감지된 엔티티는 업데이터해서 트랜잭션에 커밋하기 때문이다!!

```java
try {
    Member findMember = em.find(Member.class, 1L);
    findMember.setName("HelloJPA");

    tx.commit();
} catch (Exception e){
    tx.rollback();
} finally {
    em.close();//em이 결국 DB 연결을 담당하기 때문에 작업 끝나면 닫아줘야한다!!
}
```

![JPA가 작성한 SQL 쿼리문](/files/-MeUT5scHOEkFDs4YaKH)

![실제 데이터가 변경된 DB 확인](/files/-MeUTP9hC7Q0coulIy0i)

&#x20; 4\. 회원 조회 후 삭제

```java
Member findMember = em.find(Member.class, 1L);
em.remove(findMember);
```

![](/files/-MeURXHcWrQkdaXZlxJZ)

![Member 테이블에서 삭제된 모습](/files/-MeURenqcJRaRscTqsqa)

* EntityManagerFactory는 DB당 하나만 생성된다.\
  엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에 서 공유!
* EntityManager는 쓰레드간에 공유X (사용하고 버려야 한다)
* **JPA의 모든 데이터 변경은 트랜잭션 안에서 실행⭐️❤️**

JPQL 등장

결국 현업에서는 RDB에서 쿼리를 최적화해서 원하는 데이터 빠르게 조회할 수 있어야 한다! 때에 따라서는 통계성 쿼리를 작성할 수도 있다.

1. 가장 단순한 조회 방법\
   EntityManager.find(타입, id)\
   객체 그래프 탐색(a.getB().getC())
2. 복잡한 쿼리 ex)나이가 18살 이상인 회원을 모두 검색하고 싶다면?

실습 - JPQL 소개

* JPQL로 전체 회원 검색
* JPQL로 ID가 2 이상인 회원만 검색
* JPQL로 이름이 같은 회원만 검색
* JPQL에 대해 자세한 내용은 객체지향 쿼리에서 학습 예정

JPQL

* 엔티티 객체를 중심으로 개발
* 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색
* 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
* **애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검 색 조건이 포함된 SQL이 필요**

**=>**&#xBB38;제는 검색 쿼리!!

* JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공⭐️\
  \&#xNAN;**=>테이블이 아닌 객체를 대상으로 검색하기 때문에 객체 지향 쿼리(객체 지향 SQL)이다!**
* SQL과 문법 유사!\
  SELECT, FROM, WHERE, GROUP BY,HAVING, JOIN 지원
* SQL을 추상화해서 특정 데이터베이스 SQL에 의존❌
* **JPQL은 엔티티 객체를 대상으로 쿼리**\
  SQL은 데이터베이스 테이블을 대상으로 쿼리
