JPA를 시작 하기 전, 알아야 할 것이 크게 두가지 있는데
바로 ORM과 영속성(persistence)이다.
Object Relational Mapping의 약자로 이름 그대로 자바의 객체와 관계형 DB를 맵핑하는 것으로서 DB의 특정 테이블이 자바의 객체로 맵핑되어 SQL문을 일일이 작성하지 않고 객체로 구현할 수 있도록 하는 프레임워크이다.
JPA를 이해하기 위해 가장 먼저 알아야 할 개념이다.
JPA는 DB와 연결하기 전, 해당 DB와 매핑할 자바 객체(Entity)를 보관할 어떠한 공간을 가지고 있는데, 이를 영속성 컨텍스트(persistence context)라 한다.
💡 영속성 컨텍스트의 장점은?
영속성 컨텍스트라는 공간에서 엔티티를 관리함으로서 얻게되는 장점은 여러가지가 있다.
1차 캐시
영속성 컨텍스트의 1차캐시라는곳에 key와 value형태로 엔티티를 보관한다.
여기서 key는 엔티티의 @Id 값이다.
동일성 보장
Collection Framework에서 객체를 가져오는 것과 같이 1차 캐시에서 id값을 통해 객체를 가져올 때 다른 새로운 객체가 아닌 동일한 객체가 반환된다.
변경 감지
jpa는 update메서드를 따로 날리는게 아닌 엔티티를 set하는것만으로도 변경이 감지되어 commit(엄밀히 말하자면 flush할 때)시에 DB에서 수정이 일어난다.
즉, 영속 상태에 있는 엔티티는 객체의 데이터가 조금이라도 변경되면 이를 자바에서 따로 다루지 않더라도 flush시 DB에 변경된대로 적용된다.
쓰기 지연
JPA는 영속성 컨텍스트에서 변경이 발생했을 때 DB에 바로 쿼리를 날리지 않고 SQL쿼리를 버퍼에 모아놨다가 flush 하는 시점에 모아놨던 쿼리를 DB에 날린다.
지연 로딩 (수정 예정)
엔티티는 4단계의 생명 주기가 있다.
비영속 (new/transient)
비영속 상태
말 그대로 Entity를 영속성 컨텍스트가 관리하지 않는 상태.
자바 순수 객체만 있는 상태로 아직 영속성 컨텍스트와 관여되지 않은 상태이거나 EntityManager.remove(Member); 로 삭제된 상태.

영속 (managed)
영속 상태
EntityManager.persist() 메서드로 Member가 영속성 컨텍스트에 들어간 상태이다.
영속성 컨텍스트의 1차캐시로 key와 value를 가진 Map형태로 들어갔다.
EntityManager.find()로 DB에 있는 데이터를 영속성 컨텍스트에 넣을 수도 있다.

준영속 (detached)
준영속 상태
EntityManager.detach(Member);로 영속성 컨텍스트에 들어간 엔티티를 떼어낼 수 있다.
1차 캐시에 있던 데이터와 쓰기지연 공간의 엔티티 관련SQL문이 모두 사라진다.
