> 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 구동 방식](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MeUc4VKhWsl2htmm4Qn%2F-MeUcDTRt_mDZaKUV6HU%2FScreen%20Shot%202021-07-13%20at%208.29.05%20PM.png?alt=media\&token=acf32bfe-950c-41c6-83c9-48e8275be8ea)

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

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();

    }
}
```

![회원 조회 결과](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MeUQaI6p88jkO7EV4A2%2F-MeUR3KMEWXaIBK3I_r-%2F%E1%84%92%E1%85%AC%E1%84%8B%E1%85%AF%E1%86%AB%20%E1%84%8C%E1%85%A9%E1%84%92%E1%85%AC%20%E1%84%80%E1%85%A7%E1%86%AF%E1%84%80%E1%85%AA.png?alt=media\&token=970f0145-9178-4f3c-9b58-35711646bb14)

&#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 쿼리문](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MeUSr6sBGlvm_bTZqQ9%2F-MeUT5scHOEkFDs4YaKH%2FScreen%20Shot%202021-07-13%20at%207.44.52%20PM.png?alt=media\&token=63744ac2-060d-4e93-a0ff-dd5df0516906)

![실제 데이터가 변경된 DB 확인](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MeUTHdg7ielQOQ7SJVm%2F-MeUTP9hC7Q0coulIy0i%2FScreen%20Shot%202021-07-13%20at%207.46.03%20PM.png?alt=media\&token=fa7fad76-ebca-4ef4-a4fd-0a8e2d39b732)

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

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

![](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MeUR6ZKAMW1P-9bKSx6%2F-MeURXHcWrQkdaXZlxJZ%2FScreen%20Shot%202021-07-13%20at%207.37.21%20PM.png?alt=media\&token=a102eb63-0581-4382-9467-5a89acbfedea)

![Member 테이블에서 삭제된 모습](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MeURbvvfSzFcBg2gdAb%2F-MeURenqcJRaRscTqsqa%2FScreen%20Shot%202021-07-13%20at%207.37.45%20PM.png?alt=media\&token=54bb5a9b-2f32-4f77-9efd-8a79418b1623)

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