JPA - 영속성 컨텍스트가 뭐죠?
영속성 컨텍스트 : 요약
1. Java는 DB에 바로 다이렉트 접근이 불가하지만, 영속성 컨텍스트는 DB로 다이렉트 접근이 가능하다.
2. Java가 DB에 CRUD하는 일련의 모든 정보를 영속성 컨텍스트에서 확인할 수 있다.
3. Java는 항상 영속성 컨텍스트를 통해서 DB에 데이터를 저장하고, DB는 DB에 있는 데이터를 영속성 컨텍스트를 통해서 Java로 전달한다.
4. 영속성 컨텍스트에 있는 모든 일들은 자동으로 처리가 된다. (너무 신기하다!)
영속성 컨텍스트의 개념
영속성 컨텍스트라는 말 자체가 감이 안오기 때문에 영속성 / 컨텍스트 말을 뜯어서 정의해보겠다.
- 영속성 : 데이터를 영구적으로 저장하는 성질 -> Spring Boot에서는 데이터를 영구적으로 저장하는 것이 DB에서 가능하다. 여기서 말하는 DB는 MySql, Oracle 등
- 컨텍스트 : 프로그래밍에서 자주 나오는 단어, 어떤 대상의 모든 정보

예시를 통한 ORM에서의 영속성 컨텍스트 존재 이유
- 영속성 컨텍스트는 Java 안에 포함되어 있다
- 영속성 컨텍스트는 Java가 DB에 저장하려는 데이터의 모든 정보(컨텍스트)를 다 알고있다
- 아래의 그림은 Java에서 동물데이터를 DB에 저장할 때의 실제 구조이다.


예시 1. Java에서 동물데이터를 DB에 저장하려고 할 때
1. Java는 '동물데이터'를 영속성 컨텍스트에 던진다.
2. 영속성 컨텍스트는 Java가 던진 '동물데이터'를 DB에 던져준다
3. DB에 '동물데이터'가 저장된다

예시2. Java에서 저장된 '동물데이터'를 삭제하려고 할 때
1. Java에서 '동물데이터'를 삭제하기 위해 영속성 컨텍스트에서 '동물데이터'를 삭제한다.
2. 다시 영속성 컨텍스트에서 '동물 데이터가 삭제된 후의 데이터'를 DB로 넘긴다.
3. DB에서도 영속성 컨텍스트와의 동기화 작업을 통해 '동물데이터'가 삭제된다.

예시3. Select
개발자가 과일데이터 select 요청을 했는데, 과일데이터가 DB에만 있는 경우 (영속성 컨텍스트에도 없는 경우)
1. Java의 select 요청이 DB로 다이렉트 접근이 되는 것이 아니라, select 요청이 영속성 컨텍스트로 가게 됨
2. 영속성 컨텍스트는 현재 '과일데이터'가 없는 상황이기에, 영속성 컨텍스트는 DB에게 다이렉트 접근을 하여 '과일데이터'를 달라고 요청함
3. DB에서 '과일데이터'를 영속성 컨텍스트에게 제공함 / 현재 ) DB와 영속성 컨텍스트 두 곳에 '과일데이터'가 존재하는 상황
4.영속성 컨텍스트에서 '과일데이터'를 Java에 넘겨줌
결론 : '과일데이터' - Java, 영속성 컨텍스트, DB 세 곳에 모두 존재함, 세 곳의 '과일데이터'는 모두 같은 데이터 (Type은 상이함)

예시4. Update
'과일데이터'의 내용을 변경하려할 때 : ex. 사과 -> 딸기
과일데이터가 세 곳에 모두 존재하는 상황에서 '과일데이터'의 내용을 사과 -> 딸기로 변경하려 할 때
1. 개발자가 명령어를 작성하여 '과일데이터'의 내용을 사과 -> 딸기로 변경함
2. 영속성 컨텍스트에 있는 '과일데이터'의 내용이 '사과' -> 딸기로 변경됨
3. 영속성 컨텍스트에서 DB로 commit에서 데이터 변경 내용을 밀어넣으면, Update문이 자동호출되면서
DB 상의 '과일데이터' 내용도 사과 -> 딸기로 변경됨
결론 : Java, 영속성 컨텍스트, DB 세 곳의 '과일데이터' 내용 -> 딸기
∵ Update문이 자동 호출되는 이유 : 영속성 컨텍스트의 과일데이터(딸기)와 DB의 과일데이터(사과)의 내용이 다르기 때문에, 동기화 작업을 통해 DB의 과일데이터를 '딸기'로 갈음하기 위하여 Update문이 자동 호출되는 것