[JPA 시리즈] 1 - 영속성 컨텍스트 (2 - 준영속)

2025. 11. 19. 02:29·Development/Java(Spring, JPA, etc.)

앞 글에서 이어집니다.


직전에 미처 설명하지 못한 준영속을 알아보자.

 

준영속?

앞전에 설명했다시피 JPA에서 객체가 영속성 컨텍스트에 들어가 관리를 받고 있는 상태를 영속, 영속 상태에서 컨텍스트에서 분리되어 나오면 준영속 상태라고 했다.

그런데 이 시점에서 '근데 왜 객체가 컨텍스트에서 떨어져 나와서 연관도 없어졌는데 비영속이 아니라 준영속임?'이라는 의문이 생길 것이다. 이미 분리되어 나와서 관리도 안되지, 거기에다 영속성 컨텍스트가 제공하는 기능도 사용을 하지 못하니 언뜻 겉으로 보기에는 비영속 상태와 다를 바가 없어 보이기도 하다.

하지만 비영속 상태와 준영속 상태의 차이점은 준영속은 비영속 상태와 달리 객체에 식별자를 가지고 있다. 이때 준영속 상태의 객체가 merge(병합)라는 과정을 거치면 다시 영속 상태로 돌아갈 수 있게 된다.

 

준영속 상태로 만드는 법

영속 상태의 객체를 준영속 상태로 만드는 방법에는 크게 세 가지가 있다.

  • EntityManager.detach(entity): 특정 엔티티를 준영속 상태로 전환
  • EntityManager.clear(): 영속성 컨텍스트를 완전 초기화
  • EntityManager.close(): 영속성 컨텍스트 종료

준영속 상태의 객체의 핵심은 '객체가 식별자를 가지고 있느냐' 이기 때문에 객체에 식별자를 생성한 상태로 영속성 컨텍스트를 초기화하거나 종료하는 등 영속성 컨텍스트의 관리에서 벗어나게 하면 된다.

 

주의점?

준영속 상태의 객체 자체의 주의점이라기보다는 객체 생성 시의 주의점인데, 객체를 생성할 때 식별자를 임의로 저장하지 말아야 한다.

비영속 상태의 객체가 식별자를 가지고 있는 상태에서 영속화 시도를 하게 되면 영속화 과정 중에 이 객체를 준영속 객체로 간주를 하게 되어 예외가 발생하게 되기 때문이다.

@Getter @Setter
@NoArgsConstructor
@Entity
public class Member {  // 객체 클래스
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
 
    private String name;
 
    private int age;
}

/* 임의의 테스트 */
class EntityTest {
    @PersistenceContext
    private EntityManager em;
    
    void test() {
        Member member = new Member();
        
        member.setId(1L);  // Error!  -->  비지정 상태로 두어야 함
        member.setName("member1");
        member.setAge(20);
        
        em.persist(member);
    }
}

위 예시와 같이 멤버 객체에 식별자를 명시적으로 지정해 주게 되면 영속화 과정에서 예외가 발생하게 된다.

그리고 제일 좋은 방법은 위 엔티티 클래스에서 Setter를 빼고 생성자를 통해 값을 지정해 주는 것이다.

 


 

다음 편에는 엔티티를 매핑하는 여러 가지 방법들을 알아보자.

저작자표시 비영리 변경금지 (새창열림)

'Development > Java(Spring, JPA, etc.)' 카테고리의 다른 글

[JPA 시리즈] 1 - 영속성 컨텍스트(1)  (0) 2025.11.12
'Development/Java(Spring, JPA, etc.)' 카테고리의 다른 글
  • [JPA 시리즈] 1 - 영속성 컨텍스트(1)
Polaris_
Polaris_
  • Polaris_
    아무거나 다 적는 블로그
    Polaris_
  • 전체
    오늘
    어제
    • 분류 전체보기 (15) N
      • Development (14) N
        • TIL (Today what I Learned) (0)
        • 데브코스(TIL, 회고록 등등...) (10)
        • Java(Spring, JPA, etc.) (2) N
        • 코딩 테스트 (알고리즘) (0)
        • 기타 (1)
      • 일상 (1)
      • 여행기 (0)
        • 국내 (0)
        • 해외 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩부트캠프
    css
    프로젝트 설계
    Postman
    JPA
    React
    데브코스
    node.js
    javascript
    TIL
    국비지원교육
    html
    typescript
    준영속
    프로그래머스 데브코스
    Express.js
    docker
    풀스택
    MySQL
    포트폴리오
    웹
    HTTP
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Polaris_
[JPA 시리즈] 1 - 영속성 컨텍스트 (2 - 준영속)
상단으로

티스토리툴바