JPA(Java Persistence API)란?
ORM을 위한 Java 표준 API
JPA 구현체: HIBRNATE, OpenJpa, EclipseLink, DataNucleus, ...
Persistence(영속성): 애플리케이션 종료 후에도 객체(데이터)가 유지되는 것
ORM(Object/Relation Mapping) Framework - HIBERNATE
객체는 참조로 연결된 형태
RDB는 고정되어 있는 2차원 테이블
이 두 모델 간의 변환을 HIBERNATE(Orm Framework)이다.
객체 모델과 관계형 모델의 비교
JPA의 개요와 설정
SQL Mapper(MyBatis) vs ORM framework(HIBERNATE)
DB에 변경 사항 발생 시 고쳐야 할 것이 많다.
둘 다 장단점이 존재한다. 오래된 기업들은 RDB가 중요하고 실무에서 복잡한 일처리하기 위해서는 JPA로 하기 어렵다. DB 중심 개발을 바꾸기가 쉽지 않다.
Spring Data
저장소 종류가 달라도 일관된 데이터 처리 방법을 제공
EntityManager와 EntityManagerFactory
EntityManagerFactory: EntityManager를 생성. 애플리케이션에 하나
EntityManager: Entity를 관리하는 객체. Entity를 저장 관리. 사용자당 하나. 공유 불가
사용자는 직접 DB에 명령내리는 대신, EntityManager로만 작업
저장은 persist(), 조회는 find(), 삭제는 remove(), 변경은 Entity의 setter를 이용
Entity 클래스의 작성
Entity 클래스: DB 테이블의 한 행(row)을 정의한 것.
*** 순서는 보장되지 않는다.
database에서는 대소문자 구분하지 않는다.
Entity 클래스의 작성을 위한 애너테이션
@Generated
자동 번호 생성을 적용할 속성에 사용
GenerationType.TABLE
GenerationType.SEQUENCE
GenerationType.IDENTITY
GenerationType.AUTO
EntityTransaction
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction tx = entityManager.getTransaction(); //트랜잭션 얻기
User user = new User(); // User 객체를 생성하고 초기화
user.setId("aaa");
user.setPassword("1234");
tx.begin(); // 트랜잭션을 시작
entityManager.persist(user); // User 객체를 저장
tx.commit(); // 트랜잭션을 종료(작업 내용을 DB에 반영)
Hibernate가 SQL을 자동 생성한다.
PreparedStatement
Transaction이란?
더 이상 나눌 수 없는 작업의 단위
Commit과 Rollback
PersistenceContext = PC = Entity 저장공간
*** AC = Application Context = 빈(bean) 저장소
em.persist(entity)
: 비영속 상태의 entity가 PersistenceContext에 저장되고 엔터티를 영속 상태로 바꾸고, SQL 저장소에 INSERT문을 저장한다.em.remove(entity)
: Entity Manager가 PersistenceContext에서 해당 Entity를 제거em.flush()
: db에 sql이 전송된다. SQL 저장소에 누적된 SQL문을 DB로 전달. tx.rollback()
가능em.find(User.class, "a")
: 캐시에서 Entity를 먼저 조회. 캐시에 없을 때만 DB에서 조회한다.em.clear()
를 통해 캐시를 비운다.