본문 바로가기

JPA

JPA 란? 영속성 컨텍스트란?

728x90
반응형
SMALL

국비 학원 다니신분들은 80%이상은 자바 퍼시스턴스 프레임워크인 MYBATIS를 사용했을거라고 생각함.

 

본인도 학원에서 MYBATIS를 사용했고, 회사를 다니게되면서 JPA라는 것에 대해 처음으로 접했음.

 

이제 JPA가 먼지 알아보자.

 

사실 MYBATIS는 SQL Mapper의 한 종류이기때문에 JPA와 비교 대상이 아님.

 

JPA는 ORM 기술임. (Java Persistence API)

 

ORM이란

 

간단하게 설명하면

객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 뜻한다.

 

DB테이블과 자바 객체 사이의 매핑을 처리해주는 ORM 이란 기술의 표준임.

 

JPA를 쓰면 왜 좋을까?

 

1. 엔티티를 생성하면 자동으로 테이블을 만들어준다.

 

2. 필드가 추가되거나 삭제되어도 JPA가 일련의 과정을 대신 처리해준다.

 

3. JDBC API를 사용하는 지루하고 반복적인  CRUD 같은 일을 메소드로 대신 처리해주어 생산성이 향상된다.

 

4. 상속 , 연관관계, 객체그래프 탐색 등의 패러다임의 불일치 문제를 해결해준다.(말이어렵다그쳐)

 

5. 관계형 데이터베이스는 같은 기능도 벤더마다 사용법이 다른 경우가 많다.

(예를들어 페이징처리같은경우 데이터베이스마다 달라서 사용법을 배워야하는데, JPA는 인터페이스만 가져다가 쓰면 끝임.)

 

JPA를 이해하려면 영속성 컨텍스트를 알아야함.

 

위에 그림은 Entity 생명주기임.

 

영속성 컨텍스트 = 쉽게말하면 걍 디비 저장하기전에 있는 임시저장공간이라고 생각하면됨.

 

 

비영속 :  영속석 컨텍스트가 아님

 

영속 :  영속성 컨텍스트안에서 관리되는 것

 

준영속 :  영속성 컨텍스트에 있었다가 분리된 상태

 

삭제 :  삭제된 상태

 

 

비영속

 

엔티티 객체를 생성했지만 영속성 컨텍스트에 저장하지 않은 상태

Member member = new Member();

 

영속

 

엔티티 매니저(엔티티를 누군가가 대신 관리한다고보면됨.)를 통해서 엔티티를 영속성 컨텍스트에 저장한 상태

영속성 컨텍스트에 엔티티가 들어가는 순간 영속성 컨텍스트가 다 관리함.

 

em.persist(member);

 

준영속

 

영속성 컨텍스트가 관리하던 영속 상태의 엔티티 더이상 관리하지 않으면 준영속 상태가 됨.

// 엔티티를 영속성 컨텍스트에서 분리해 준영속 상태로 만든다.
em.detach(member);
// 영속성 콘텍스트를 비워도 관리되던 엔티티는 준영속 상태가 된다.
em.claer();
// 영속성 콘텍스트를 종료해도 관리되던 엔티티는 준영속 상태가 된다.
em.close();

준영속 상태가되면

 

1차 캐시 , 쓰기 지연, 변경 감지, 지연 로딩 등 영속성 컨텍스트가 제공하는 기능에 동작이 안됌(왜냐 영속성 컨텍스트에 없거든여)

 

식별자 값을 갖고있음.

 

 

 

삭제

 

엔티티를 영속성 컨텍스트와 디비에서 지움.

 

em.remove(member);

 

정리하면..!!!!!!

 

//비영속 상태(그냥객체만생성함)
Member member = new Member();
member.setId(10L);
member.setName("HelloWorld");

//EntityManager 를 만듬.
EntityManager em = emf.createEntityManager();

//영속 상태(객체를 영속상태로 변신시켜줌)
em.persist(member); //영속성 컨텍스트에 있지만 DB에 저장이 되는게 아님.
//지나고
//여기서 DB저장됨.

//준영속 상태로 변신
em.detach(member);

//객체 삭제
em.remove(member);

 

 

 

 

 

 

 

728x90
반응형
LIST

'JPA' 카테고리의 다른 글

Insert Query 줄이기(성능개선)  (0) 2023.04.10
N+1 문제  (0) 2023.03.16
JPQL 사용 시 DTO Mapping 하는 법  (1) 2023.02.24
Entity의 null값으로 인해 default 설정 반영이 안될 때  (0) 2022.12.14
Spring data jpa 란?  (3) 2022.04.08