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 기능 사용해 한번에 전송
- 1. 1차 캐시와 동일성 보장:
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 |