JPA는 객체를 통해 데이터베이스와 상호작용한다.
위의 코드를 보면 우리는 EntityManager를 통해
1. 객체를 등록 -> 쿼리를 통해 데이터 베이스에 저장
2. 수정 -> 수정된 값을 무언가? 가 알아서 읽어서 데이터베이스에 쿼리를 통해 저장
3. 한 건 조회 -> Member.class 중 특정 id를 조회
하였다.
이렇게 jpa에서는 무언가?를 통해 등록, 수정, 조회 등 데이터베이스와 상호작용을 할 수 있었다.
그 무언가에 대하여 알아보자.
1. 무언가란 무엇인가?
이것은 바로 영속성 컨텍스트라는 것이다.
영속성 컨텍스트
영속성 컨텍스트란 엔티티(객체)를 저장할 수 있는 환경이다.
즉, 로직을 통해
객체 등록 로직 -> 영속성 컨텍스트에 저장 + 객체 정보를 데이터 베이스에 저장하는 쿼리 -> 데이터 베이스 저장
이런 방식으로 우리는 jpa를 사용할 수 있는 것이다.
우선, 영속성 컨텍스트를 통한 jpa의 동작 과정을 간단히 알아보자.
1. member라는 객체를 만들었다.->비영속
그저 member라는 객체를 만들어 매핑만 해주었을 뿐이다.
이를 비영속 상태 라고한다.
2. member객체를 persist() 메소드를 통해 영속성 컨텍스트에 포함시켜주었다.-> 영속
위의 그림을 보면 member객체가 영속성 컨텍스트에 포함된 것을 알 수 있다.
이때, 영속성 컨텍스트는 아래와 같은 방식으로 member객체를 저장한다.
위의 그림을 보면 영속성 컨텍스트 안에 @id와 entity가 있는 표가 있다.
이를 1차 캐시라고 한다.
즉, 영속성 컨텍스트는 엔티티(객체)를 저장하기 위한 캐시라는 공간을 갖고 있다.
persist() 메소드는 하나의 엔티티를 영속성 컨텍스트의 1차 캐시 안에 넣음으로 영속 상태로 만든다.
다시 정리해보면,
우리는 객체를 만들어 매핑 후, 엔티티 매니저의 메소드 persist()를 통해 영속성 컨텍스트 안에 넣어주었다.
영속성 컨텍스트 안에서 우리는 조회, 수정, 삭제 등의 일을 수행할 수 있다.
다음은 조회, 수정을 알아보겠다.
============================================================================================
여기서 잠깐, 조회, 수정을 알아보기 위해서는 flush(플러쉬)라는 기능을 알아둘 필요가 있다.
플러쉬란, 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것을 말한다.
플러쉬를 실행할 시
1. 영속성 컨텍스트의 원래의 모습(스냅샷)을 기억해 놓았다, 수정된 엔티티를 찾는다.
2. 스냅샷과 수정된 엔티티의 모습을 비교하여, 쓰기 지연 SQL 저장소에 적절한 수정하는 쿼리를 만들어 저장한다.
3. 쓰기 지연 SQL 저장소에 저장된 쿼리들을 데이터 베이스에 전송한다.
아래의 그림을 순서대로 보자.
1. member 엔티티의 name을 바꾸었다.
2. 플러쉬 실행1-변경을 감지했다.
3. 플러쉬 실행2-쓰기 지연 SQL 저장소에 변경 쿼리를 저장하고 그곳에서 이 쿼리를 데이터베이스에 보낸다.
위의 그림들을 보면 모든 쿼리는 쓰기 지연 SQL 저장소에 저장된다.
즉, 일단 영속성 컨텍스트에서 엔티티들을 다룬 후 플러쉬 실행 시 쓰기 지연 SQL 저장소의 쿼리를 통해 데이터베이스에 자동으로 등록되거나 수정, 삭제가 되는 것이다.
*플러쉬는 flush()로 실행할 수 있고, JPQL을 실행하거나, 트랜잭션 커밋 시 자동으로 실행된다.
============================================================================================
조회하기
Member member = entityManager.find(Member.class, "member1");
위의 코드를 보면 find() 메소드의 파라미터로 클래스명과, 엔티티의 @id부분을 넘겨주는 것을 볼 수 있다.
우선, find() 메소드가 실행되면,
1. 1차 캐시에서 엔티티를 찾는다.
2. 1차 캐시에 엔티티가 없을 경우 쓰기 지연 SQL 저장소를 거치지 않고, 바로 데이터 베이스에서 쿼리를 실행해, 엔티티를 찾아온다.
3. 식별자는 @id의 값이다.
지금까지 등록, 수정을 알아보았다. 삭제는 그냥 remove() 메소드로 특정 엔티티만 삭제하면 되기 때문에, 굳이 하지는 않겠다.
위의 것들은 영속 상태의 엔티티들을 비영속으로 만들거나, 엔티티 자체를 수정하는 것이었다.
즉, 영속 상태와 비영속 상태를 다루었다고 볼 수 있다.
하지만, 마지막으로 영속 상태와 비영속 상태 말고도, 준영속 상태도 있다.
아래는 준영속 상태에 대하여 알아보겠다.
<내용 추가 예정>
'jpa 개념' 카테고리의 다른 글
Jakarta Persistence 궁금한 것들만 좀 정리(1편) (0) | 2025.04.15 |
---|---|
List를 saveAll하기 (0) | 2024.12.28 |
JPA 기본 (0) | 2024.01.12 |