본문 바로가기
카테고리 없음

Entity 생명주기

코동이 2021. 9. 12.

Entiy Manager의 메서드 사용에 따라서 달라진다.

 

1. 비영속상태(transient)

@Service
public class UserService {
    @Transactional
    public void put() {
        User user = new User();
        user.setName("reUser");
        user.setEmail("reUser@fastcampus.com");
    }
}


=================


@Test
void test() {
    userService.put();

    System.out.println(userRepository.findByEmail("reUser@fastcampus.com"));
}

null이 나온다, 왜냐하면 EntityManger에 의해 관리되지 않았기 때문이다.

 

2. 영속상태(mangered)

    @Transactional
    public void put() {
        User user = new User();
        user.setName("reUser");
        user.setEmail("reUser@fastcampus.com");

        entityManager.persist(user);
    }
    
    
    ==================
    
    
    @Test
    void test() {
        userService.put();

        System.out.println(userRepository.findByEmail("reUser@fastcampus.com"));
    }

null이 아닌 저장된 객체가 나온다. 왜냐하면 EntityManger에 의해 persist()로 영속상태에 들어갔기 때문이다.

 

 

    @Transactional
    public void put() {
        User user = new User();
        user.setName("reUser");
        user.setEmail("reUser@fastcampus.com");

        entityManager.persist(user);

        user.setName("newreUser");
    }
    
    ========================
    
    @Test
    void test() {
        userService.put();

        System.out.println(userRepository.findByEmail("reUser@fastcampus.com"));
    }

 

영속성으로 관리되는 객체의 경우 set메서드를 이용하면 트랜잭션이 종료될 때, 자동으로 update를 한다. dirty check라고 하는데, 영속성 컨텍스트에 있는 객체가 로드될 때 스냅샷으로 보관하고 있다가 변경내용이 감지되면, 트랜잭션이 종료될 때 일일이 비교해서 변경된 내용을 업데이트 한다. 변경된 내용이 없더라도 항상 dirty check를 한다.

 

3. 준영속상태(detached)

    @Transactional
    public void put() {
        User user = new User();
        user.setName("reUser");
        user.setEmail("reUser@fastcampus.com");

        entityManager.persist(user);
        entityManager.detach(user);

        user.setName("newreUser");
    }
    
   
    ==================
    
    
    @Test
    void test() {
        userService.put();

        System.out.println(userRepository.findByEmail("reUser@fastcampus.com"));
    }

 

준영속상태는 영속성에서 더이상 관리하지 않는것을 의미한다. 따라서 맨 마지막에 이름을 newreUser로 설정하였지만, 바로 위에 entityManager.detach(user)를 했기 때문에, 더이상 영속성에 속해있지 않아서 DB에 반영되지 않는다.

 

혹시 준영속상태에 있지만, 변경사항을 DB에 반영하고 싶다면 merge를 이용하면 된다.

entityManager.merge(user);

이름이 최종적으로 다시 반영된 것을 확인할 수 있다.

 

detach()뿐만 아니라 clear(), close()도 있으며, 좀 더 파괴적인 기능이다.

entityManager.clear();

persist()했던 작업 이후 작업은 모두 반영되지 않는다. 그러므로, clear()를 사용하고 싶다면, 꼭 그 이전에 flush()를 통해 DB에 반영하도록 한다.

 

 

4. 삭제상태(delete)

entityManager.remove(user);

entityManger.remove(user)를 하면, user 객체는 제거된다. 따라서, 이 이후에 모든 set메서드 변경은 작동하지 않는다.

 

반응형