본문 바로가기
Category/SpringBoot

영속화(Persistence)란?

by Corinee 2025. 2. 14.
728x90
반응형

- 객체(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()를 호출하면 "영속화"가 자동으로 이루어짐