일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 데이터베이스
- 인텔리제이
- GET
- set
- post
- JPA
- 구글
- SEO
- Login
- 리액트오류
- useEffect
- @Entity
- linkedhastset
- Thymeleaf
- 구글알고리즘
- @Controller
- ChatGPT
- @Query
- Polylang
- 워드프레스
- HttpSession
- router
- mergeattributes()
- @Repository
- addallattributes()
- 구글애널리틱스
- db
- 플러그인
- GA4
- firebase
- Today
- Total
개발천재
[Spring Boot] JPA 영속성 컨텍스트 완벽 이해: 개념부터 실전 활용까지 본문
JPA가 엔티티를 관리하는 "메모리 저장소"
영속성 컨텍스트(Persistence Context) 이해하기
쉽게 말해, "영속성 컨텍스트(Persistence Context)"는 JPA가 데이터베이스와 직접 연결하지 않고 엔티티 객체를 관리하는 메모리 공간이다. JPA를 통해 엔티티를 저장하거나 조회하면, 이 객체는 "영속성 컨텍스트"에 보관된다.
데이터베이스랑 직접 연결해서 쓰면 매번 SQL을 실행해야 하지만, JPA는 "영속성 컨텍스트"라는 임시 저장소를 이용해서 객체를 메모리에 올려두고 관리할 수 있다.
JPA는 엔티티를 직접 DB에 저장하지 않고, 영속성 컨텍스트에 먼저 보관한다!
필요하면 영속성 컨텍스트에서 먼저 꺼내 쓰고, 수정된 내용은 자동으로 DB에 반영된다!
영속성 컨텍스트에서 빼면 더 이상 JPA가 관리하지 않는다!
영속성 컨텍스트의 주요 특징
영속성 컨텍스트는 JPA가 엔티티를 관리하는 메모리 공간이다. 1차 캐시로 인해 같은 트랜잭션에서는 같은 객체를 반환한다. 변경 감지 (Dirty Checking)를 통해 자동으로 변경 사항을 반영하고, detach() 하면 영속성 컨텍스트에서 제외된다는 특징이 있다.
영속성 컨텍스트 덕분에 JPA는 성능 최적화 + 자동 변경 감지 기능을 제공할 수 있다.
① 엔티티를 1차 캐시에 저장 (변경 감지 기능)
JPA에서 find()를 사용하면 DB에서 바로 가져오는 것이 아니라, 먼저 영속성 컨텍스트(메모리)에서 찾는다.
변경 감지(Dirty Checking): 엔티티를 수정하면 트랜잭션이 끝날 때 DB에 자동 반영된다(flush() 호출).
User user = entityManager.find(User.class, 1L); // id가 1인 User 조회
user.setName("새로운 이름"); // 엔티티 값 변경
// 트랜잭션이 끝나면 자동으로 update SQL 실행됨
② 동일한 트랜잭션에서는 같은 객체 반환
같은 id의 엔티티를 find() 하면 새로 조회하지 않고 영속성 컨텍스트에 있는 객체를 그대로 반환한다.
User user1 = entityManager.find(User.class, 1L);
User user2 = entityManager.find(User.class, 1L);
System.out.println(user1 == user2); // true (같은 객체)
③ 트랜잭션이 끝나면 자동으로 반영 (flush())
트랜잭션이 commit 되면 변경된 데이터가 자동으로 DB에 반영된다.
@Transactional
public void updateUser(Long id) {
User user = entityManager.find(User.class, id);
user.setName("변경된 이름");
// 트랜잭션이 끝나면 UPDATE SQL 실행됨 (flush)
}
④ detach() 하면 영속성 컨텍스트에서 제거
detach()를 하면 더 이상 변경 감지가 동작하지 않는다.
User user = entityManager.find(User.class, 1L);
entityManager.detach(user); // 영속성 컨텍스트에서 분리
user.setName("변경된 이름");
// 트랜잭션이 끝나도 UPDATE SQL 실행되지 않음
영속성 컨텍스트를 사용하는 방법
JPA에서 엔티티를 저장, 조회, 수정, 삭제할 때 영속성 컨텍스트가 자동으로 동작한다. 영속성 컨텍스트는 EntityManager 또는 Spring Data JPA의 @Transactional을 통해 사용할 수 있다.
EntityManager 이해하기
EntityManager는 JPA에서 데이터베이스와 소통하는 핵심 객체이다. 영속성 컨텍스트를 관리하며, 엔티티를 저장, 조회, 수정, 삭제하는 역할을 한다.
쉽게 설명하면 EntityManager는 "JPA의 비서" 같은 존재이다. 개발자가 데이터베이스와 직접 대화하는 대신, EntityManager가 대신 일을 처리해준다. 영속성 컨텍스트(1차 캐시)를 활용하여 성능을 최적화한다.
영속성 컨텍스트 사용하기
persist()를 사용하여 엔티티 저장 (INSERT)
persist(user)를 호출하면 DB에 즉시 저장되지 않고, 영속성 컨텍스트에 먼저 저장된다.
트랜잭션이 끝나면 JPA가 자동으로 DB에 INSERT SQL 실행한다.
Member member = new Member();
member.setName("유진");
em.persist(member); // 🔥 영속성 컨텍스트에 등록
find()를 사용하여 엔티티 조회 (SELECT)
먼저 영속성 컨텍스트에서 찾고, 없으면 DB에서 가져온다.
같은 id의 엔티티를 여러 번 조회하면 DB를 다시 조회하지 않고, 같은 객체를 반환한다.
@Transactional
public void findUser() {
User user = entityManager.find(User.class, 1L); // id=1인 User 조회
System.out.println(user.getName()); // "Alice"
}
엔티티 값을 변경하면 자동 반영 (UPDATE)
아래의 예시를 보면 setName("Bob")으로 변경했을 뿐인데, DB에 UPDATE SQL이 자동으로 실행된다.
JPA는 변경 감지(Dirty Checking) 기능이 있어서 setName()으로 값을 바꾸면 자동으로 UPDATE 쿼리를 실행한다.
persist() 없이 단순히 엔티티 값만 바꿔도 자동 저장된다 (트랜잭션 종료 시 flush()).
@Transactional
public void updateUser() {
User user = entityManager.find(User.class, 1L); // 영속 상태
user.setName("Bob"); // 값 변경
// `flush()` 자동 실행 → 변경된 내용이 DB에 UPDATE됨
}
remove()를 사용하여 엔티티 삭제 (DELETE)
remove(user)를 호출하면 영속성 컨텍스트에서 제거된다.
트랜잭션이 끝나면 자동으로 DELETE SQL 실행된다.
@Transactional
public void deleteUser() {
User user = entityManager.find(User.class, 1L); // 먼저 조회
entityManager.remove(user); // 삭제
// 트랜잭션이 끝나면 DELETE SQL 실행됨
}
detach()를 사용하여 영속성 컨텍스트에서 분리
detach(user)를 하면 JPA가 이 객체를 관리하지 않는다.
이후 변경해도 DB에 반영되지 않는다 (변경 감지 X).
@Transactional
public void detachUser() {
User user = entityManager.find(User.class, 1L); // 영속 상태
entityManager.detach(user); // 영속성 컨텍스트에서 분리
user.setName("Charlie"); // 변경했지만 DB에 반영되지 않음!
}
정리
기능 | JPA 메서드 | 설명 |
저장 (INSERT) | persist(entity) | 영속성 컨텍스트에 저장 후, 트랜잭션 종료 시 DB에 반영 |
조회 (SELECT) | find(Entity.class, id) | 영속성 컨텍스트에서 먼저 찾고, 없으면 DB에서 조회 |
수정 (UPDATE) | 엔티티 값 변경만 해도 자동 반영 | 변경 감지(Dirty Checking)로 자동 UPDATE 실행 |
삭제 (DELETE) | remove(entity) | 트랜잭션 종료 시 DELETE SQL 실행 |
관리 해제 | detach(entity) | 영속성 컨텍스트에서 분리 → 변경해도 반영되지 않음 |
영속성컨텍스트를 사용하려면 entityManager를 써야할까?
반드시는 아니지만 대부분 EntityManager를 통해 영속성 컨텍스트를 사용한다.
영속성 컨텍스트(Persistence Context)는 JPA에서 엔티티 객체를 관리하는 메모리 공간이다. 쉽게 말해, 엔티티의 상태(저장, 조회, 수정, 삭제)를 관리하는 1차 캐시 같은 역할을 한다.
JPA에서 영속성 컨텍스트를 활용하려면 EntityManager를 사용해야 하지만 Spring Boot 환경에서는 @Transactional과 Spring Data JPA를 활용하면 EntityManager 없이도 가능하다.
'개발 준비 > Spring Boot' 카테고리의 다른 글
[Spring Boot] JPQL로 이해하는 데이터베이스 접근 방식 (0) | 2025.02.27 |
---|---|
[Spring Boot] JPA 매핑 어노테이션 정리 (1) | 2025.02.27 |
[Spring Boot] 페이징 기능 구현하기 (0) | 2025.02.26 |
[Spring Boot] @Transactional, 스프링에서 트랜잭션을 다루는 방법 (0) | 2025.02.26 |
[Spring Boot] H2 Database 이용해서 더미 데이터 만들기 (1) | 2025.02.24 |