Spring

[JPA 기본편] JPA 기초

gogi masidda 2024. 6. 14. 16:23

JPA 구동 방식

  • JPA는 Persistence라는 클래스가 있다.
  • Persistence에서 시작해서 설정 정보를 조회하여 EntityManagerFactory라는 클래스를 만든다.
    • EntityManagerFactory는 애플리케이션 전체에서 공유
  • 필요할 때마다 EntityManager를 찍어내서 사용한다. 
    • EntityManager는 쓰레드 간에 공유를 하지 않음. (사용하고 버려야 함)

EntityManagerFactory는 애플리케이션 로딩 시점에 딱 하나만 만들어야 한다.

실제 DB에 저장하는 트랜잭션 단위(DB커넥션을 얻어서 쿼리를 날리고 종료)는 EntityManager를 만들어줘야 한다.

JPA에서는 트랜잭션 단위가 매우 중요하다. 모든 작업은 트랜잭션 안에서 작업을 해야 한다. 

 


코드 예제

Member 객체

@Entity
//@Table(name = "USER") 객체와 데이터베이스 테이블의 이름이 다를 때
public class Member {
    @Id
    private Long id;
    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;
    }
}

 

회원 등록

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(1L);
            member.setName("Jack");

            em.persist(member);

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

        }

        emf.close();
    }
}

실제로 쓸 땐 try catch문 없어짐

 

수정 시에는 set...()로 이름을 바꾸고, persist()를 해주지 않아도 된다. 

 

@Entity가 붙은 클래스는 데이터베이스의 테이블과 연결될 클래스임을 의미한다. 


 

JPQL

  • 단순한 CRUD는 JPA가 처리해주지만, 쿼리는 JPQL이 필요하다. 
  • pagenation이 좋음
  • JPA를 사용하면 엔티티 객체 중심으로 개발
  • 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 
  • 애플리케이션이 필요한 데이터만 DB에서 불러오려면, 결국 검색 조건이 포함된 SQL이 필요하다. 
  • JPQL은 엔티티 객체를 대상으로 쿼리
  • SQL은 데이터베이스 테이블을 대상으로 쿼리 
List findMembers = em.createQuery("select m from Member as m", Member.class)
	.getResultList();

 

728x90