1️⃣ 개요
JPA 에 대한 기본 개념을 익히기 전에 ORM, JPA, Hibernate 가 무엇인지 알고 공부하는 것이 좋다.
https://jnsodevelop.tistory.com/41
[JPA] ORM, JPA, Hibernate 개념
ORM ORM (Object-Relational Mapping) 은 말 그대로 객체와 관계형 데이터베이스가 매핑(Mapping)되는 것을 줄여서 표현한 것이다. 객체와 데이터베이스 테이블간의 연결을 도와준다. SQL 쿼리문이 아닌 프로
jnsodevelop.tistory.com
오늘은 JPA 구동 방식, 영속성, 영속성 컨텍스트 등에 대해 공부해보았다.
2️⃣ JPA 구동 방식

JPA 구동 방식에 대한 큰 틀은 위 그림과 같다.
'Persistence' 는 영속성이란 뜻으로, META-INF 디렉토리에 들어있는 'persistence.xml' 파일의 설정 정보를 참고하여 'EntityManagerFactory' 를 생성한다. 이는 다시 'EntityManager' 를 생성한다.
'persistence.xml' 파일에 대한 정보는 아래 글에서 확인하면 된다.
https://jnsodevelop.tistory.com/43
[Spring] H2 Database 연결 feat. JPA
개요 요즘 Spring 공부를 하면서 김영한님의 JPA 강의도 듣고 있다. 데이터베이스에는 MySQL, Oracle, MongoDB 등 종류가 정말 많지만, 공부를 할 때에는 H2 데이터베이스를 사용한다. Maven 으로 프로젝트
jnsodevelop.tistory.com
EntityMangerFactory 와 EntityManager
1. EntityMangerFactor
프로그램은 하나의 EntityManagerFactory 를 가지며, 이는 프로그램 실행 시점에 생성되고, 종료 시점에 소멸한다.
즉, 하나만 생성되어 애플리케이션 전체에서 공유된다.
2. EntityManger
EntityManager 은 EntityManagerFactory 를 통해 생성되며, 하나의 Thread 가 생성될 때마다 생성된다.
따라서 EntityManager 은 Thread 간 공유하지 못하도록 사용하고 버려야 한다.
3. Transaction
여기서 'Transaction' 이라는 개념이 등장하는데, 이는 데이터베이스에서 논리적 상태 변화인 추가(Insert), 수정(Update) , 삭제(Delete) 로 데이터의 변화가 있는 것을 말한다.
JPA 에서 모든 데이터의 변경은 transaction 안에서 실행되어야 한다.
따라서 EntityMangerFactory 를 통해 EntityManager 를 생성한 뒤 EntityTransaction 의 begin() 이후에 데이터베이스를 다룰 수 있다. 코드를 보면 다음과 같다.
import javax.persistence.*;
public class JpaMain {
public static void main(String[] args){
EntityManagerFactory emf= Persistence.createEntityManagerFactory("name");
EntityManager em=emf.createEntityManager();
EntityTransaction tx=em.getTransaction();
tx.begin();
try{
//..
tx.commit();
}catch (Exception e){
tx.rollback();
}finally {
em.close();
}
emf.close();
}
}
1. EntityManagerFactory, EntityManager, EntityTransaction 을 생성한다.
2. transaction 내부에서 작업을 진행하기 위해 tx.begin() 이 필요하다.
3. try : try 구문 내에서 DB 와 관련된 코드를 작성한 뒤 tx.commit() 을 통해 DB 에 쿼리를 날린다.
4. catch : 만약 예외가 발생하면 쿼리를 날리지 않고 rollback 한다.
5. finally 이후 : DB에 쿼리가 적용되었다면 EntityManger, EntityManagerFactory 를 차례대로 close() 해준다.
3️⃣ 영속성 (Persistence)
영속성 (Persistence) 은 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다. 이는 파일 시스템 또는 관계형 DB 등에서 적용되는 개념이다. 영속성을 갖지 않는 데이터는 메모리에만 존재하기 때문에 프로그램이 종료되면 데이터는 사라진다. JPA 에서는 이 '영속성' 이라는 개념이 매우 중요하다.
4️⃣ 영속성 컨텍스트 (Persistence Context)
영속성 컨텍스트 (Persistence Context) 는 영속성을 갖는 데이터에 대해 엔티티를 영구적으로 저장하는 환경으로, 논리적인 개념이다.EntityManager 를 통해 접근 가능하며 Spring Container 처럼 눈에 보이지 않는다.
지금은 영속성 컨텍스트와 EntityManager 을 같은 개념으로 보겠다. (쉽게 설명하기 위해서이다.)
영속선 컨텍스트를 이해하기 위해서는 우선 엔티티의 생명 주기를 알아야 한다.
여기서 엔티티 (Entity) 는 데이터의 집합을 의미하며, 데이터 모델링에서 사용되는 객체이다.
나중에 자세히 다루도록 하고 지금은 단지 위처럼 이해하면 되겠다.
엔티티의 생명주기는 크게 네 가지로 나눌 수 있다.
1. 비영속 (new/transient)
2. 영속 (managed)
3. 준영속 (detached)
4. 삭제 (removed)
그림으로 보면 다음과 같다.

1) 비영속
비영속은 단순히 객체만 생성되고 EntityManager 가 관리하지 않는 상태를 말한다.
즉, 객체는 생성되었지만 영속성 컨텍스트에 포함되어있지 않은 상태이다.
ex) 쉽게 설명하자면 '사과' 라는 Entity 가 있고 '냉장고' 라는 영속성 컨텍스트가 있다고 하자.
아직 사과가 냉장고에 들어있지 않는다면, 냉장고가 사과를 관리하지 않으므로 사과는 비영속 상태이다.
// 비영속 (단순히 객체만 생성)
People people = new People();
people.setId("people1");
people.setUsername("회원1");
2) 영속
영속은 객체가 생성된 뒤 EntityManager 에 의해 관리되는 상태, 즉 영속성 컨텍스트에 들어있는 상태를 말한다.
이는 EntityManger 의 'persist()' 메서드를 통해 구현할 수 있다.
여기서 주의할 점은 'transaction' 내부에서 실행되어야 한다.
ex) 사과가 냉장고에 들어있다면 사과는 영속 상태이다.
// 비영속 (단순히 객체만 생성)
People people = new People();
people.setId("people1");
people.setUsername("회원1");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// 영속 (객체를 EntityManager 가 관리)
em.persist(people);
3) 준영속
준영속은 객체가 영속성 컨텍스트에서 분리된 상태를 말한다.
즉, 영속성을 갖던 Entity 가 영속성 컨텍스트에서 빠져 나온 것이다.
ex) 사과는 다시 냉장고 밖으로 나왔다.
// 준영속 (영속성 컨텍스트에서 분리)
em.detach(people);
4) 삭제
삭제는 말 그대로 객체를 삭제한 상태를 말한다.
ex) 사과를 먹은 것이다.
// 삭제 (객체를 삭제)
em.remove(member);
그렇다면 이런 복잡한 개념들을 왜 사용하는 것일까?
영속성 컨텍스트를 사용하면 얻는 이점이 많기 때문이다. 이후에 영속성 컨텍스트에 대해 자세히 다뤄보겠다.
1️⃣ 개요
JPA 에 대한 기본 개념을 익히기 전에 ORM, JPA, Hibernate 가 무엇인지 알고 공부하는 것이 좋다.
https://jnsodevelop.tistory.com/41
[JPA] ORM, JPA, Hibernate 개념
ORM ORM (Object-Relational Mapping) 은 말 그대로 객체와 관계형 데이터베이스가 매핑(Mapping)되는 것을 줄여서 표현한 것이다. 객체와 데이터베이스 테이블간의 연결을 도와준다. SQL 쿼리문이 아닌 프로
jnsodevelop.tistory.com
오늘은 JPA 구동 방식, 영속성, 영속성 컨텍스트 등에 대해 공부해보았다.
2️⃣ JPA 구동 방식

JPA 구동 방식에 대한 큰 틀은 위 그림과 같다.
'Persistence' 는 영속성이란 뜻으로, META-INF 디렉토리에 들어있는 'persistence.xml' 파일의 설정 정보를 참고하여 'EntityManagerFactory' 를 생성한다. 이는 다시 'EntityManager' 를 생성한다.
'persistence.xml' 파일에 대한 정보는 아래 글에서 확인하면 된다.
https://jnsodevelop.tistory.com/43
[Spring] H2 Database 연결 feat. JPA
개요 요즘 Spring 공부를 하면서 김영한님의 JPA 강의도 듣고 있다. 데이터베이스에는 MySQL, Oracle, MongoDB 등 종류가 정말 많지만, 공부를 할 때에는 H2 데이터베이스를 사용한다. Maven 으로 프로젝트
jnsodevelop.tistory.com
EntityMangerFactory 와 EntityManager
1. EntityMangerFactor
프로그램은 하나의 EntityManagerFactory 를 가지며, 이는 프로그램 실행 시점에 생성되고, 종료 시점에 소멸한다.
즉, 하나만 생성되어 애플리케이션 전체에서 공유된다.
2. EntityManger
EntityManager 은 EntityManagerFactory 를 통해 생성되며, 하나의 Thread 가 생성될 때마다 생성된다.
따라서 EntityManager 은 Thread 간 공유하지 못하도록 사용하고 버려야 한다.
3. Transaction
여기서 'Transaction' 이라는 개념이 등장하는데, 이는 데이터베이스에서 논리적 상태 변화인 추가(Insert), 수정(Update) , 삭제(Delete) 로 데이터의 변화가 있는 것을 말한다.
JPA 에서 모든 데이터의 변경은 transaction 안에서 실행되어야 한다.
따라서 EntityMangerFactory 를 통해 EntityManager 를 생성한 뒤 EntityTransaction 의 begin() 이후에 데이터베이스를 다룰 수 있다. 코드를 보면 다음과 같다.
import javax.persistence.*;
public class JpaMain {
public static void main(String[] args){
EntityManagerFactory emf= Persistence.createEntityManagerFactory("name");
EntityManager em=emf.createEntityManager();
EntityTransaction tx=em.getTransaction();
tx.begin();
try{
//..
tx.commit();
}catch (Exception e){
tx.rollback();
}finally {
em.close();
}
emf.close();
}
}
1. EntityManagerFactory, EntityManager, EntityTransaction 을 생성한다.
2. transaction 내부에서 작업을 진행하기 위해 tx.begin() 이 필요하다.
3. try : try 구문 내에서 DB 와 관련된 코드를 작성한 뒤 tx.commit() 을 통해 DB 에 쿼리를 날린다.
4. catch : 만약 예외가 발생하면 쿼리를 날리지 않고 rollback 한다.
5. finally 이후 : DB에 쿼리가 적용되었다면 EntityManger, EntityManagerFactory 를 차례대로 close() 해준다.
3️⃣ 영속성 (Persistence)
영속성 (Persistence) 은 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다. 이는 파일 시스템 또는 관계형 DB 등에서 적용되는 개념이다. 영속성을 갖지 않는 데이터는 메모리에만 존재하기 때문에 프로그램이 종료되면 데이터는 사라진다. JPA 에서는 이 '영속성' 이라는 개념이 매우 중요하다.
4️⃣ 영속성 컨텍스트 (Persistence Context)
영속성 컨텍스트 (Persistence Context) 는 영속성을 갖는 데이터에 대해 엔티티를 영구적으로 저장하는 환경으로, 논리적인 개념이다.EntityManager 를 통해 접근 가능하며 Spring Container 처럼 눈에 보이지 않는다.
지금은 영속성 컨텍스트와 EntityManager 을 같은 개념으로 보겠다. (쉽게 설명하기 위해서이다.)
영속선 컨텍스트를 이해하기 위해서는 우선 엔티티의 생명 주기를 알아야 한다.
여기서 엔티티 (Entity) 는 데이터의 집합을 의미하며, 데이터 모델링에서 사용되는 객체이다.
나중에 자세히 다루도록 하고 지금은 단지 위처럼 이해하면 되겠다.
엔티티의 생명주기는 크게 네 가지로 나눌 수 있다.
1. 비영속 (new/transient)
2. 영속 (managed)
3. 준영속 (detached)
4. 삭제 (removed)
그림으로 보면 다음과 같다.

1) 비영속
비영속은 단순히 객체만 생성되고 EntityManager 가 관리하지 않는 상태를 말한다.
즉, 객체는 생성되었지만 영속성 컨텍스트에 포함되어있지 않은 상태이다.
ex) 쉽게 설명하자면 '사과' 라는 Entity 가 있고 '냉장고' 라는 영속성 컨텍스트가 있다고 하자.
아직 사과가 냉장고에 들어있지 않는다면, 냉장고가 사과를 관리하지 않으므로 사과는 비영속 상태이다.
// 비영속 (단순히 객체만 생성)
People people = new People();
people.setId("people1");
people.setUsername("회원1");
2) 영속
영속은 객체가 생성된 뒤 EntityManager 에 의해 관리되는 상태, 즉 영속성 컨텍스트에 들어있는 상태를 말한다.
이는 EntityManger 의 'persist()' 메서드를 통해 구현할 수 있다.
여기서 주의할 점은 'transaction' 내부에서 실행되어야 한다.
ex) 사과가 냉장고에 들어있다면 사과는 영속 상태이다.
// 비영속 (단순히 객체만 생성)
People people = new People();
people.setId("people1");
people.setUsername("회원1");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// 영속 (객체를 EntityManager 가 관리)
em.persist(people);
3) 준영속
준영속은 객체가 영속성 컨텍스트에서 분리된 상태를 말한다.
즉, 영속성을 갖던 Entity 가 영속성 컨텍스트에서 빠져 나온 것이다.
ex) 사과는 다시 냉장고 밖으로 나왔다.
// 준영속 (영속성 컨텍스트에서 분리)
em.detach(people);
4) 삭제
삭제는 말 그대로 객체를 삭제한 상태를 말한다.
ex) 사과를 먹은 것이다.
// 삭제 (객체를 삭제)
em.remove(member);
그렇다면 이런 복잡한 개념들을 왜 사용하는 것일까?
영속성 컨텍스트를 사용하면 얻는 이점이 많기 때문이다. 이후에 영속성 컨텍스트에 대해 자세히 다뤄보겠다.