jpa에 대한 전반적인 흐름 파악을 위한 정리 후 다음 글에 키워드 별로 자세히 정리하기
JPA 설명(Java Persistence API)
- 자바 진영의 ORM 기술 표준
ORM은 객체 관계 매핑을 의미하며 객체는 객체대로 관계형 데이터베이스는 관계형 데이터베이스대로
설계 후 ORM 프레임워크가 중간에서 매핑 해주는 역할을 한다.
- JPA는 인터페이스의 모음으로 jpa를 구현하는 구현체들이 있다. ex) Hibernate, EclipseLink, DataNumcleus
- 저장: jpa.persist() , 조회 : jpa.find() , 수정: member.setName() , 삭제: jpa.remove
- 객체에 상속을 설정하면 JPA가 해당 상속에 맞춰 쿼리로 처리해준다.
- 연관관계와 객체 그래프 탐색도 가능
- 동일한 트랜잭션에서 조회한 엔티티는 같다
- JPA는 특정 데이터베이스에 종속 하지 않는다 -> 각각의 데이터베이스에 맞춰 dialect 속성에 지정해주면 다양한 DB 사용 가능
- @Entity : JPA가 관리할 객체를 지정 / @Id: 데이터베이스 PK와 매핑
- 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유하고 엔티티 매니저는 쓰레드간에 공유 안됨(사용하고 버려야 한다). JPA의 모든 데이터 변경은 트랜잭션 안에서 실행
JPQL
- JPA를 사용하면 엔티티 객체를 중심으로 개발하기 때문에 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리
- 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다. 이 때 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 하니애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다.
- SQL과 문법 유사하며 앤티티 객체를 대상으로 한다 < - > SQL은 데이터베이스 테이블을 대상으로 쿼리
[1차 캐시와 동일성 보장]
- 같은 트랜잭션 안에서는 같은 엔티리를 반환함으로서 조회 성능 향상을 기대 할 수 있다.
String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); //SQL로 호출
Member m2 = jpa.find(Member.class, memberId); //앞에서 sql로 호출된 데이터가 캐시에 저장되어있어 가져옴
boolean result = (m1 == m2) // true
[트랜잭션을 지원하는 쓰기 지연]
1. 트랜잭션을 커밋할 때까지 INSERT SQL을 모은 후 JDBC BATCH SQL 기능을 사용해 한번에 SQL 전송
2. 지연로딩이란 객체가 실제 사용될 때 로딩되는 것 / 즉시로딩이란 JOIN SQL로 한번에 연관된 객체까지 미리 조회
JPA를 사용하는 이유
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성이 좋고 유지보수 성능이 좋음 (내가 공부하며 느낀 체감으로는 myBatis를 사용할 때는 애플리케이션에 소스를 수정하면 그에 맞춰 DB도 하나하나 수정해줘야 했는데 JPA는 기본적으로 애플리케이션 소스 안에서 객체 수정으로 끝내는 부분이 더 편리하다고 느껴졌다.
* 해당 공부 내용은 김영한 강사님의 인프런 강의를 학습하며 정리한 내용입니다. - https://www.inflearn.com/course/ORM-JPA-Basic
'Spring > JPA' 카테고리의 다른 글
| [JPA] 상속관계 매핑 (0) | 2023.03.05 |
|---|---|
| [JPA] 연관관계 매핑의 종류 (0) | 2023.03.05 |
| [JPA] EntityMapping / 연관관계 매핑2 (0) | 2023.03.04 |
| [JPA] EntityMapping / 연관관계 매핑 1 (0) | 2023.03.04 |
| [JPA] 영속성 컨텍스트 (0) | 2023.03.03 |