2 - JPA 엔티티 관리

dropKick·2020년 7월 24일
0

JPA 엔티티 매핑과 엔티티 관리

어노테이션 매핑

@Entity
@Table(name="MEMBER")
public class Member {

    @Id
    @Column(name = "ID")
    private String id;

    @Column(name = "NAME")
    private String username;

    private Integer age;
  • @Entity 객체지향 코드의 클래스와 엔티티를 매핑
  • @Table 엔티티 클래스와 매핑 할 DB 테이블 정보, 생략 시 엔티티 이름과 테이블 이름을 매핑
  • @Id 엔티티 클래스 필드를 테이블의 PK인 ID에 매핑, PK가 달라지면 달라지기에 식별자 필드라고 한다.
  • @Column 엔티티 클래스의 username필드와 컬럼 NAME 매핑
  • 어노테이션 미존재 시 필드명을 사용하여 컬럼명과 매핑, DB가 대소문자 구분 시 명시적으로 매핑 어노테이션을 추가 해주어야 함.

persistence.xml 영속성 설정 관리

  • persistence.xml 없이 실행 시 파서가 엔티티 매니저를 찾을 수 없음
  • 특이하게 데이터베이스 방언(dialect)를 설정

데이터 베이스 방언(dialect)

  • 데이터베이스는 각각 다른 플랫폼임
  • 데이터베이스는 각각 다른 문법이나 함수를 가지고 있고 이걸 데이터베이스 방언이라고 함
  • JPA는 JDBC 위에 구현 된 계층으로 데이터베이스 방언과 상관없이 모든 데이터베이스를 다룰 수 있어야하기에 데이터베이스 방언 구현체를 별도 제공
    각 방언들만 변경한다면 JPA만으로 MySQL, Oracle, H2 SQL 등 모든 RDB 사용 가능

엔티티 매니저 팩토리와 엔티티 매니저

JPA 동작은 엔티티 매니저 팩토리 -> 엔티티 매니저 -> 트랜잭션 -> 비즈니스 로직 -> 트랜잭션 종료 -> 엔티티 매니저 종료 -> 엔티티 매니저 팩토리 종료라는 순서를 가짐.

엔티티 매니저 팩토리

  • 엔티티 매니저 팩토리는 엔티티 매니저들을 가지는 컨테이너와 같음
  • 엔티티 매니저 팩토리는 persistenc unit을 기반으로 생성 되는데, DBCP도 동시에 생성 되기에 엔티티 매니저 팩토리 이하 EMF는 기반 비용이 매우 큼
  • EMF는 애플리케이션 전체에서 딱 한번만 생성하고 모두가 공유

엔티티 매니저

  • 엔티티 매니저가 실제적 JPA의 기능을 제공
  • 엔티티 매니저를 통해 CRUD 동작을 하고 이는 EMF를 통한 DBCP를 통해 이루어짐
  • 엔티티 매니저는 DB 커넥션을 유지하므로 다중 스레드를 허용하면 안됨

비즈니스 로직 특이사항

public static void logic(EntityManager em) {

        String id = "id1";
        Member member = new Member();
        member.setId(id);
        member.setUsername("지한");
        member.setAge(2);

        //등록
        em.persist(member);

        //수정
        member.setAge(20); // em.update가 아닌 .set엔티티 값만 변경 

        //한 건 조회
        Member findMember = em.find(Member.class, id);
        System.out.println("findMember=" + findMember.getUsername() + ", age=" + findMember.getAge());

        //목록 조회
        List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
        System.out.println("members.size=" + members.size());

        //삭제
        em.remove(member);
    }
  • 수정은 엔티티 값만 변경 시 JPA가 이미 매핑된 엔티티를 추적하여 SQL문을 생성
  • 수정을 제외한 나머지 동작은 엔티티 매핑정보를 넘겨주거나 엔티티를 넘겨주어야 함

JPQL(Java Persistence Qurey Language)

   //목록 조회
TypedQuery<Member> query = 
em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
  • JPA를 통한 CRUD는 SQL을 전혀 사용하지 않는 엔티티 중심의 개발
    그런데 검색의 경우 엔티티 검색을 하려면 모든 걸 엔티티 객체로 불러와 변환 후 검색해야 하는데 이는 사실 상 불가능
  • 자바에서는 검색 조건이 포함된 SQL, JPQL을 통해 이를 해결
  • JPQL과 SQL의 차이점
    • JPQL은 엔티티 객체 대상 쿼리(클래스와 필드)
    • SQL은 테이블 대상 쿼리

즉 "select m from Member m" 부분은 Member 테이블이 아닌 엔티티 클래스 Member에 대한 쿼리, JPQL은 테이블을 전혀 알지 못한다!
따라서 JQPL 사용은 먼저 JPQL 쿼리 객체를 생성하고 쿼리 객체 메소드를 호출하면 JPA가 JPQL을 통해 SQL 쿼리를 요청하는 방식으로 이루어진다.

0개의 댓글