본문 바로가기

Spring/JPA

JPA Basic - Intro

1. Intro. 

  • 1. JPA 공부가 어려운 이유
    • 객체와 테이블을 제대로 설계하고 매핑하는 방법을 알려주지 않는다.
    • 1:N, N:1, 1:1, N:M 매핑등의 개념이 난이도 있다.
    • 실무 노하우 + 성능에 대해서 알려주지 않는다. 
  • 2. JPA가 실무 사용이 어려운 이유.
    • JPA의 내부 동작 방식 이해 못해서
    • JPA가 어떤 SQL을 만들어 내는지 이해하지 못함.
    • JPA가 언제 SQL을 만들어 내는지 이해하지 못함.
  • 3. SQL 중심의 개발의 문제점.
    • 개발자는 객체를 RDB에 저장하게 됨.
    • 객체와 RDB의 차이가 있음.
    • 상속 : RDB에서는 JOIN하는 과정을 거쳐야 하고 그 과정은 매우 복잡.
    • 연관관계: 객체는 참조를 사용/ 테이블은 외래키를 사용
    • -> 객체를 테이블에 맞추어서 저장. 근데 객체는 Long이 아닌 객체를 연결)
  • 4. ORM
    • 객체는 객체대로 설계. RDB는 RDB대로 설계. ORM이 중간에서 매핑.
    • JPA가 JDBC를 사용해줌. 
과정. 
-1. Entity 분석
-2. 쿼리 생성
-3. JDBC API 사용
-4. 패러다임 불일치 해결

 

  • 5. JPA 사용이유.
    • 생산성: 자바 컬렉션에서 명령어로 쿼리를 날릴수 있다. (쿼리 작성 및 매핑 불필요.)
    • 유지보수: 쿼리 수정시 모든 쿼리 관련 쿼리 찾아가며 관리해야 함.
    • JPA와 패러다임 불일치 해결
      • 1. 상속: 개발자는 jpa.persist만 하면 나머지는 JPA가 조인과 다중 insert쿼리 날려줌.
      • 2. 연관관계, 객체 그래프 탐색: JPA가 성능 최적화 고려해서 JOIN하여 가져와 줌.
      • 3. 비교하기: 동일한 트랙잭션에서 조회한 엔티티는 같음을 보장. (마치 객체처럼)
      • 4. 성능 최적화 기능
    • 해결법
      • 1. 1차 캐시와 동일성 보장:
        • 같은 트랙잭션안에서는 같은 엔티티 반환
      • 트랙잭션을 지원하는 쓰기 지연.
        • 트랙잭션을 커밋할때까지 insert SQL을 모음. JDBC Batch SQL 기능 사용해 한번에 전송

2. JPA 실행.

  • Dialect를 이용해서 다른 데이터 베이스 사용가능. (하이버네이트 약 40가지 방언 지원) 
  • 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유
  • 엔티티 매니저는 쓰레드간에 공유 하지 않음.(사용하고 버려야함.)
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행. (트랜잭션 안걸어도 내부적으로 그렇게 처리)
  • 검색 조건이 필요한 쿼리는 JPQL이용. JPQL은 앤티티 객체를 대상으로 쿼리. SQL은 데이터 베이스에 의존.
- 동작방식
1. 설정정보 조회(META-INF/persistence.xml)
2. EntityManagerFactory 생성
3. EntityManager생성 

 

  • JPA 기본 예제
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello")

EntityManager em = emf.createEntityManager();

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

try{
	Member member = new Member;
    member.setId(2L);
    member.setName("MyName");
    
    em.persist(member);
    
    //JPQL
    List<Member> result = em.createQuery("select m from Member as m", Member.class)
    							.setFirstResult(1)
                                .setMaxResults(8)
                                .getResultList();
     for(Member member : result(){
     	System.out.println("member.name = " + member.getName();
     }
     
    
    
    tx.commit();
} catch(Exception e){
	tx.rollback();
} finally {
	em.close();
}

emf.close()

 

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

JPA Basic - 값 타입  (0) 2024.01.09
JPA Basic - 프록시, CASCADE, 고아객체  (0) 2024.01.09
JPA Basic - 상속관계 매핑  (0) 2024.01.09
JPA Basic - 엔티티 매핑  (0) 2024.01.09
JPA Basic - 영속성 관리  (0) 2024.01.08