JPA 기본개념

길셔·2022년 8월 14일
0

JPA

목록 보기
2/7
  • persistence라는 클래스에서 ‘META-INF/persistence.xml’를 통해 설정 정보 조회 > EntityManagerFactory라는 클래스를 만들고, 필요시마다 EntityManager를 찍어내서 돌린다.


EntityManager em = emf.createEntityManager();
// 실제 동작하는 코드를 작성 ( DB에서 데이터를 불러오기, 또는 저장 )
em.close();

emf.close();
  • 사용하는 클래스에서 위처럼 작성

  • EntityManagerFactory 는 어플리케이션 로딩 시 1번만 생성

  • 실제 하나의 동작을 수행할 때마다 (트랜잭션 단위로 동작할 때마다) EntityManager를 생성해서 사용한다.


  • 데이터 어노테이션

    • @Entity : 로딩시 JPA에게 해당 테이블로 맵핑하라고 알려주는 기능

    • @Id ( javax.persistence ): 처음 테이블 등록 시 JPA에게 pk를 알려줘야 함

    • @Table : 클래스명과 DB의 테이블명이 다를때 테이블명을 작성하면 JPA가 보고 테이블명으로 맵핑

    • @Colum : 컬럼명이 다르면 해당 컬럼명으로 맵핑


  • 트랜잭션 사용

    • 회원 검색
      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("HelloA");
    
              em.persist(member);
    
              tx.commit();
          }catch (Exception e){
              tx.rollback();
          }finally {
              em.close();
          }
    
          emf.close();
      }
    • JPA는 트랜잭션 단위가 굉장히 중요하기 때문에, JPA의 모든 작업은 반드시 트랜잭션 안에서 작업을 해야한다.

    • manager와 로직 사이에 em.getTransaction(); 으로 트랜잭션 생성

    • tx.begin(), tx.commit()으로 실행과 종료

    • 이 부분을 그냥 순차적 나열하기보단, try~catch로 담아서 실행


    • 회원 수정
  Member findMember = em.find(Member.class, 1L)
  findMember.setName("HelloJpa);
  • JPA를 통해서 엔티티를 가져오면 JPA가 관리하고, 변경이 되는지 안되는지를 커밋하는 시점에 체크 후 변경되면 업데이트 쿼리를 작성해서 적용한다.


    • 회원 삭제
Member findMember = em.find(Member.class, 1L);
em.remove(findMember)



  • 정리

    • 그래서 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유해야 하고,
    • 엔티티 매니저는 쓰레드간의 공유를 하면안되고 사용하고 버려야한다.
    • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행해야한다.


  • JPQL

    • 위의 빨간칸처럼 QUERY를 통해서 컬렉션 형태로 받아오고 다양한 메소드로 WHERE절과 같이 적용하면된다.

    • 정리
      • 단순히 조회하는 것이 아닌 조건이 있다면, SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 통해서 쿼리의 조인과 다양한 쿼리문 작성하여 사용하면 된다.

      • JPA를 사용하면 특정 DB에 종속적이지 않게 엔티티 객체를 중심으로 개발하지만 검색하는 쿼리가 문제이다.

      • 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색하기에 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하다.

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

      • SQL과 문법이 유사하며 SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다.

      • 이둘의 차이점은 SQL은 DB 테이블을 대상으로 쿼리가 적용되지만, JPQL은 엔티티 객체를 대상으로 쿼리가 적용된다.
profile
까먹지말자

0개의 댓글