Object - Relational Mapping
객체와 관계형 데이터베이스 매핑.
Mapping : 중간에서 무언가를 해주는 것.
즉, ORM 프레임워크가 중간에서 다른 부분들을 매핑해서 해결해준다!
-> 대중적인 언어에는 대부분 ORM 존재.
-> ORM 프레임워크는 객체와 테이블을 매핑하여 패러다임 불일치 문제를 개발자 대신 해결.
-> 즉, 객체를 데이터베이스에 저장할 때, INSERT SQL을 직접 작성하는 것이 아닌, 객체를 자바 컬렉션이 저장하듯 ORM 프레임워크에 저장하면, ORM 프레임워크가 적절한 INSERT SQL을 생성하여 데이터베이스에 객체를 저장해준다.
Java Persistence API
자바 진영의 ORM 기술 표준.
자바 ORM 기술에 대한 API 표준 명세.
자바 애플리케이션과 JDBC 사이에서 동작.
자바에서 DB와 통신하려면 JDBC API 써야 함 -> 이전에는 개발자가 직접 JDBC API를 썼다면, JPA가 대신 해주는 것.
jpa.persist(member); //Jpa 사용해 객체 저장
DAO에서 persist로 Entity Object를 넘기면,
JPA에서 Entity 분석, INSERT SQL 생성, JDBC API 사용, 패러다임 불일치 해결해줌.
Member member = jpa.find(memberId); //jpa 사용해 객체 조회
JPA에서 SELECT SQL 생성, JDBC API 사용, ResultSet 매핑, 패러다임 불일치 해결해줌.
오픈 소스.
엔티티 저장, 수정, 삭제, 조회 등등 엔티티와 관련된 모든 일 처리.
즉, 엔티티를 관리하는 관리자.
like '엔티티를 저장하는 가상의 데이터베이스'
공장에서 엔티티 매니저를 생성하는 비용은 거의 들지 않는다.
여러 스레드가 동시 접근할 경우 동시성 문제 발생 -> 스레드 간 공유 절대 금지.
//엔티티 매니저 팩토리 생성
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("jpabook");
//공장에서 엔티티 매니저 생성 -> 비용 거의 안든다.
EntityManager em = emf.createEntityManager();
(애플리케이션과 데이터베이스 사이에 존재하는 무언가)
-> 논리적인 개념 & 눈에 보이지 않음.
: JPA를 이해하는데 가장 중요한 언어!!!!!
=> ⭐️ "엔티티를 영구 저장하는 환경"
EntityManager.persist(entity);
-> DB에 저장 X, 영속성 컨텍스트에 저장 O.
J2SE 환경
EntityManager를 생성하면 1:1로 그 안에 PersistenceContext(영속성 컨텍스트)가 생성됨.
( 엔티티 매니저 내부에 눈에 보이지 않는 영속성 컨텍스트 공간이 생기는 것임. )
=> 엔티티 매니저를 통해 영속성 컨텍스트에 접근
영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
//✅ 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("memberId");
member.setUsername("회원1");
//jpa 관계 없이 객체만 생성한 상태.
-> 객체 생성만 하고, 엔티티 매니저에 아무것도 안넣고 생성만 한 상태, 셋팅만 한 상태.
영속성 컨텍스트에 관리되는 상태
EntityManager.persist(entity);
-> 영속 상태(managed 상태)가 되는 것.
//객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("memberId");
member.setUsername("회원1"); //jpa 관계 없이 객체만 생성한 상태.
EntityManeger em = emf.createEntityManager();
em.getTransaction().begin();
//✅ 객체를 저장한 상태 (영속)
em.persist(member);
➕ 영속 상태는 되지만, 실질적으로 DB에 저장되는 것은 아님.
-> DB는 이후 커밋해야 저장됨
-> 즉, 트랜잭션을 커밋하는 시점에 DB에 쿼리 날라감. commit();
영속성 컨텍스트에 저장되었다가 분리된 상태
em.detach();
//객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("memberId");
member.setUsername("회원1"); //jpa 관계 없이 객체만 생성한 상태.
EntityManeger em = emf.createEntityManager();
em.getTransaction().begin();
//객체를 저장한 상태 (영속)
em.persist(member);
// ✅ 준영속
em.detach(member); //-> 영속성 컨텍스트에서 다시 지움.
회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태로! -> 영속성 컨텍스트와 아무 관련이 없어짐.
삭제된 상태
em.remove();
// ✅ 삭제
em.remove(member); //-> DB 삭제 요청
실제 DB 삭제 요청.
" 실제 영구 저장한, 데이터베이스에서 지우겠다. "