[자바 ORM 표준 JPA 프로그래밍 - 기본편] JPA 시작하기(2)

이재표·2023년 9월 14일
0

JPA는 어떻게 동작할까?

  1. persistence 클래스에서 시작
  2. xml 설정정보를 읽음
  3. entityManagerFactory클래스를 만듦
  4. entityManagerFactory클래스가 필요할때마다 EntityManager를 만들어서 작동

java->hellojpa->JpaMain클래스 생성

public class JpaMain {
    public static void main(String[] args) {
        // Persistence클래스가 persistence.xml(name을 hello로 설정)을 읽고, EntityManagerFactory생성
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        
        // EntityManagerFactory가 EntityManager를 생성
        EntityManager em = emf.createEntityManager();
        //code작성위치, EntityManager를 통해 쿼리를 날리는 등 jpa의 작업 진행
        em.close();
        emf.close();
    }
}

실습준비

h2데이터베이스 설정

! persistence.xml에 설정한대로 h2도 설정

  • JDBC URL : jdbc:h2:tcp://localhost/~/test
  • 사용자명 : SA
  • 비밀번호 : 없음

H2접속하여 Member테이블 생성
결국 JPA도 쿼리를 날리는것이기 때문에 테이블 설정은 필요 (DDL설정으로 바꿀수있긴함)

create table Member (
 id bigint not null,
 name varchar(255),
 primary key (id)
);

엔티티 생성

@Getter
@Setter
@Entity
public class Member {
    @Id
    private Long id;
    private String name;
}

@Entity : JPA가 관리하는 객체
@Id : 데이터베이스의 PK 값
@Getter, @Setter : get,set 메서드 롬복

JPA를 사용해보자

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

        Member member = new Member();
        member.setId(1L);
        member.setName("HelloA");
        em.persist(member);
        
        em.close();
        emf.close();
    }
}

member객체를 생성하여 데이터를 주입하고, EntityManager를 통해 저장(em.persist)하였지만 쿼리가 날아가지 않는다.

왜?

JPA에서 트랜잭션이라는 단위는 굉장히 중요하다. 트랜잭션 안에서 jpa를 통해 저장하고 조회하는 쿼리가 나가게 된다. 따라서 코드에 트랜잭션을 선언해줘야한다.

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

        EntityManager em = emf.createEntityManager();

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

        Member member = new Member();
        member.setId(1L);
        member.setName("HelloA");
        em.persist(member);
        
        System.out.println("------------");
        tx.commit();
        em.close();
        emf.close();
    }
}

EntityManager에서 트랜잭션을 얻고 begin한후 코드를 작성해준다.
필요한 쿼리가 출력이후에 날아가는것을 보아 트랜잭션을 커밋하는 시점에 쿼리가 나가는것을 볼수 있다.

아무것도 설정해주지 않았는데, 어떻게 테이블에 매핑이 되는거지?

사실 관례를 따른것이다. 아무 어노테이션도 달아주지 않는다면 클래스명을 따라가지만 @Table 또는 @Columns와 같은 어노테이션으로 매핑하는 데이터베이스에 맞게 수정할수 있다.

저장을 하였으니 나머지 RUD도 진행해보자!

EntityManager의 메서드를 이용하면 된다!
조회

em.find(원하는 객체,pk값)

삭제

em.remove(조회한 객체)

수정

조회한 객체의 데이터만을 수정하면 트랜잭션을 커밋하는 시점에 수정한다.
Member findMember = em.find(Member.class, 1L);
findMember.setName("helloB");

JPA를 통해 엔티티를 가져오면 해당 엔티티는 JPA가 관리되고, 트랜잭션 커밋하는 시점에 해당 엔티티에 수정된 사항이 있는지 확인하고, 수정되었으면 update쿼리를 날려 DB를 수정한다.

!!db는 결국 트랜잭션 안에서 데이터 변경이 되도록 설계가 되어있다!!

JPQL소개

JPA를 통한 가장 간단한 조회방법은 EntityManager.find()메서드를 이용하는 방법이다.
하지만 어떠한 조건이 걸려있는 상황이라면?
JPQL을 이용해야한다!!

JPQL

쿼리를 사용할수 있게된다. 이때 DB와 달리 테이블을 기준이 아닌 객체를 대상으로 쿼리를 짜게 된다!!

em.createQuery("select m from Member as m",Member.class).getResultList();

특정 조건을 넣어야할때 엔티티(객체)를 대상으로 쿼리를 짤수 있게해주는데, 데이터베이스 방언을 지원하여 여러 페이지네이션과 같은 기능 구현에 유용

결국 실무에서 쿼리작성은 필수적이니, 테이블을 대상으로 하는것이 아닌 엔티티를 대상으로 하여 쿼리를 편리하게 작성을 하게 도와주는것이 JPQL이다!!

0개의 댓글