- 객체(Entity)를 데이터베이스(DB)와 연결하여 저장(관리)하는 과정
- JPA/Hibernate 같은 ORM이 자동으로 엔티티를 DB에 저장하고 관리하는 것
- 영속성 컨텍스트(Persistence Context)에 의해 객체가 관리됨
1. 영속화란? (Persistence)
- JPA에서 Entity 객체를 "영속성 컨텍스트"에 저장하는 것
- 데이터를 DB에 영구적으로 저장할 수 있도록 관리
- 객체와 DB의 상태를 동기화
📌 쉽게 말하면?
→ new로 생성한 객체는 일반적인 Java 객체지만,
→ JPA의 EntityManager나 Spring Data JPA의 Repository를 통해 저장하면
→ JPA가 해당 객체를 "영속성 컨텍스트"에 등록하고 DB와 연결
2. 영속화 예제 (Spring Boot & JPA)
@Entity
@Table(name = "users")
public class User {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public void saveUser() {
// 1. 비영속 상태 (아직 DB에 저장되지 않은 객체)
User user = new User();
user.setUsername("john_doe");
// 2. 영속화 (DB 저장 & 관리)
userRepository.save(user); // EntityManager.persist() 호출됨!
// 3. 이제 user는 JPA의 "영속성 컨텍스트"에 의해 관리됨
}
}
3. 영속 상태의 특징
1. 1차 캐시 → 한 번 조회한 엔티티는 DB가 아닌 영속성 컨텍스트에서 조회
2. 동일성 보장 → 같은 트랜잭션 내에서 같은 엔티티는 항상 같은 인스턴스 유지
3. 변경 감지 (Dirty Checking) → 엔티티 값이 바뀌면 자동으로 UPDATE 수행
@Transactional
public void updateUser(Long userId) {
User user = userRepository.findById(userId).orElseThrow();
user.setUsername("new_name"); // JPA가 자동으로 변경 감지!
// @Transactional이 끝나는 순간, DB에 UPDATE 쿼리 실행
}
📌 Dirty Checking (변경 감지)란?
- setUsername()으로 객체의 값만 변경했을 뿐인데, JPA가 자동으로 UPDATE 실행
- userRepository.save()를 호출하지 않아도 변경 사항이 자동 반영됨
4. 영속성 상태 변화
상태 설명
| 비영속 (Transient) | new 키워드로 생성한 객체 (아직 JPA가 관리하지 않음) |
| 영속 (Persistent) | save()나 persist()를 호출하여 DB에 저장됨 |
| 준영속 (Detached) | detach()나 clear(), close()로 영속성 컨텍스트에서 분리 |
| 삭제 (Removed) | delete() 호출하여 영속성 컨텍스트 & DB에서 삭제 |
5. 영속화 과정 (JPA 동작 흐름)
1. new User(); // 비영속 상태 (Transient)
2. userRepository.save(user); // 영속 상태 (Persistent) → INSERT 실행
3. user.setUsername("new_name"); // Dirty Checking → 자동 UPDATE 실행
4. entityManager.detach(user); // 준영속 상태 (Detached) → 변경 감지 안됨
5. userRepository.delete(user); // 삭제 상태 (Removed) → DELETE 실행
정리
✔ JPA가 엔티티를 "영속성 컨텍스트"에 등록하여 DB와 연결하는 과정
✔ 영속 상태가 되면, 1차 캐시 / 변경 감지 / 트랜잭션 내 동일성 보장
✔ 비영속 → 영속 → 준영속 → 삭제 상태를 가질 수 있음
📌 즉, JPA의 핵심 기능(변경 감지, 1차 캐시, Lazy Loading 등)이 영속성을 기반으로 동작하는 것
📌 Spring Boot에서 save(), findById(), delete()를 호출하면 "영속화"가 자동으로 이루어짐
'Category > SpringBoot' 카테고리의 다른 글
| IntelliJ 콘솔 한글 깨짐 JDK 21 (0) | 2025.05.06 |
|---|---|
| @JsonProperty란? (0) | 2025.03.01 |
| 스프링 시큐리티의 기본 동작과 Stateless 방식의 JWT 내용 정리 (0) | 2025.01.09 |
| 스프링 부트 시작 옵션 spring.profiles.active (0) | 2024.09.09 |
| 스프링 시큐리티 #authentication.getPrincipal() (0) | 2024.09.06 |