Programming/JPA

JPA - JPA 시작하기

잇(IT) 2023. 7. 12. 18:03

- JPA 특징

1. JPA는 특정 데이터베이스에 종속하지 않는다.

- 그림과 같이 Dialect 아래 여러가지 DB들이 종속되어 사용가능하다.

 

2. Hibernate.dialect의 경우 40가지 이상의 데이터베이스를 지원한다.


- JPA 구동 방식

1. 프로젝트에서 설정한 Persistence.xml 파일에는 DB, DB 접속 관련 데이터들이 담겨있다.

2. EntityManagerFactory를 생성하면 DB와의 연결을 포함 대부분의 것들이 해결된다.

3. EntityManagerFactory 생성 이후 EntityManager을 생성하여 DB와 데이터를 주고 받는다.


 

- Member 엔티티 생성

@Entity
//관례상 @Table로 테이블 명을 작성해주지 않으면 클래스명이 테이블 명이 된다.
public class Member {

    @Id
    private Long id;

    //@Colum을 통해서 Colum 이름도 테이블에 작성된 이름으로 작성할 수 있다.
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

- JpaMain

public class JpaMain {

    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        //EntityManagerFactory를 만드는 순간 DB랑 연결도 되고 왠만한게 다 된다.
        EntityManager em = emf.createEntityManager();
        //DB와 관련된 code 작성
        //위의 코드들은 생성하는 역활이기 때문에 최초 한 번만 작성되면 된다.

        EntityTransaction tx = em.getTransaction();
        tx.begin();
        // JPA는 트랜잭션이 반드시 있어야 한다.

        try { //try catch를 사용하지 않으면 중간에 예외가 발생했을 때 끝까지 실행되지 않을 수 있기 때문에
            //예외 상황을 생각하여 try catch로 묶어서 작성하는 것이 정석이다.

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

            //조회, 수정
//            Member findMember = em.find(Member.class, 1L);
//            System.out.println("findMember.getId() = " + findMember.getId());
//            System.out.println("findMember.getName() = " + findMember.getName());
//            findMember.setName("HelloJPA");

            // JPQL
            List<Member> result = em.createQuery("select m from Member as m", Member.class)
                    .getResultList();
            for (Member member : result) {
                System.out.println("member.name = " + member.getName());
            }

            //삭제
//            em.refresh(findMember);

            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }
        emf.close();

    }
}

1. JPA는 EntityManager를 통해 JPA에서 미리 생성해놓은 API들을 통해 생성 조회 수정 삭제를 간단히 할 수 있다.

2. 별도의 Query를 작성하지 않아도 JPA에서 알아서 Query를 작성하여 DB에 전달한다.


1. 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에 서 공유

2. 엔티티 매니저는 쓰레드간에 공유X (사용하고 버려야 한다).

3. JPA의 모든 데이터 변경은 트랜잭션 안에서 실행

 

- 하지만 복잡한 동적 쿼리의 경우 JPA가 알아서 처리하지 못하기 때문에 JPQL을 사용하여 처리해준다.


- JPQL

 

1. JPA를 사용하면 엔티티 객체를 중심으로 개발

2. 문제는 검색 쿼리

3. 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색

4. 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능

5. 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검 색 조건이 포함된 SQL이 필요

 

1. JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공

2. SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원

3. JPQL은 엔티티 객체를 대상으로 쿼리

4. SQL은 데이터베이스 테이블을 대상으로 쿼리

 

1. 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리

2. SQL을 추상화해서 특정 데이터베이스 SQL에 의존X

3. JPQL을 한마디로 정의하면 객체 지향 SQL

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처 : 인프런 - 우아한 형제들 기술이사 김영한의 스프링 완전 정복 (자바 ORM 표준 JPA 프로그래밍 - 기본편)

728x90

'Programming > JPA' 카테고리의 다른 글

JPA - 고급 매핑  (0) 2023.07.14
JPA - 다양한 연관관계 매핑  (0) 2023.07.14
JPA - 연관관계 매핑 기초  (0) 2023.07.14
JPA - 엔티티 매핑  (0) 2023.07.14
JPA - 영속성 관리  (0) 2023.07.14