반응형
Notice
Recent Posts
Recent Comments
- Today
- Total
작심삼일
[매일메일] 29. 엔티티 매니저에 대해 설명해주세요. 본문
728x90
반응형
이 게시판에서는 매일메일이라는 시스템을 이용해 백엔드를 공부해보고자하는 AI 개발자가 정리해보고자 합니다.
Python이랑 비교하여 이해하기 쉽도록 합니다.
https://www.maeil-mail.kr/question/29
매일메일 - 기술 면접 질문 구독 서비스
기술 면접 질문을 매일매일 메일로 보내드릴게요!
www.maeil-mail.kr
용어 및 질문 이해하기
EntityManager는 JPA에서 데이터 저장·조회·삭제 등을 처리하는 핵심 도구이다.
여기서 영속성 컨텍스트라는 것이 등장한다.
영속성 컨텍스트는 JPA가 엔티티(객체)를 관리하는 메모리 공간이다.
즉, 계속 영속성 컨텍스트에 저장해두고 있다가, 저장할 타이밍(commit)에 한꺼번에 DB로 반영할 때 사용한다.
답변
JPA에서는 객체(=엔티티)가 다음 네 가지 상태 중 하나로 존재한다.
상태 | 의미 | Python에 비교하면 |
비영속 (New) | 아직 DB에 저장되지 않은 객체 | 그냥 User(name="Amy")만 한 상태 |
영속 (Managed) | DB에 저장되어 EntityManager가 관리함 | session.add(user) 후 commit 안 한 상태 |
준영속 (Detached) | DB와 연결이 끊긴 객체 | session.expunge(user)한 객체 |
삭제 (Removed) | 삭제 예약된 객체 | session.delete(user)한 객체 |
각각을 Python과 Java로 짜보면 다음과 같다.
from sqlalchemy.orm import sessionmaker
from models import User # 유저 모델 정의되어 있다고 가정
Session = sessionmaker(bind=engine)
session = Session()
# 1. 비영속 상태
user = User(name="Amy")
# 2. 영속 상태
session.add(user) # 아직 DB에 저장은 안 됨 (JPA의 persist)
# 3. 플러시 / 커밋 (DB에 반영)
session.commit()
# 4. 준영속 (detach 비슷하게)
session.expunge(user) # 관리 대상에서 제외됨
# 5. 삭제
session.delete(user) # 삭제 예약됨
session.commit()
import jakarta.persistence.*;
public class JPADemo {
public static void main(String[] args) {
// EntityManagerFactory 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-jpa");
EntityManager em = emf.createEntityManager();
// 트랜잭션 시작
EntityTransaction tx = em.getTransaction();
tx.begin();
// 1. 비영속 상태
Member member = new Member(); // 아직 DB와 아무 상관 없는 객체
member.setName("Amy");
// 2. 영속 상태
em.persist(member); // 영속성 컨텍스트에 등록됨 (DB에 INSERT는 아직 X)
// 3. 커밋 → INSERT 및 UPDATE 쿼리 발생
tx.commit();
// 4. 준영속 상태
em.detach(member); // 관리 끊김 → 이후 변경해도 DB에 반영 안 됨
// 5. 삭제 상태
em.getTransaction().begin();
em.remove(member); // 삭제 예약
em.getTransaction().commit();
// 종료
em.close();
emf.close();
}
}
단계 | Python (SQLAlchemy) | Java (JPA) |
비영속 | User(name="Amy") | new Member() |
영속 | session.add(user) | em.persist(member) |
값 변경 | user.name = "Emma" | member.setName("Emma") |
커밋 | session.commit() | tx.commit() |
준영속 | session.expunge(user) | em.detach(member) |
삭제 | session.delete(user) + commit | em.remove(member) + commit |
그렇다면 왜 상태 구분이 중요할까?
영속 상태인 객체는 값을 바꾸기만 해도 자동으로 변경이 감지되어 DB에 반영된다.
반대로 준영속 상태에서는 아무리 바꿔도 DB는 알 수 없다. 따라서 명시적으로 다시 persist 또는 merge 해야 한다.
그래서 실수로 detached된 객체를 바꾸고 저장하지 않으면 버그가 생길 수 있다.
결국 JPA를 안정적으로 사용하려면, 객체의 상태(영속, 준영속 등)를 항상 인지하고 있어야 한다.
728x90
반응형
'스터디 > AI 개발자가 공부하는 백엔드' 카테고리의 다른 글
[매일메일] 28. JPA의 ddl-auto 옵션은 각각 어떤 동작을 하고 어떤 상황에서 사용해야 할까요? (0) | 2025.05.01 |
---|---|
[매일메일] 27. Spring Data JPA에서 새로운 Entity인지 판단하는 방법은 무엇일까요? (1) | 2025.04.30 |
Comments