본문 바로가기

CS 잡지식

JPA가 제공하는 remove() 메서드에 대한 주의!!

//remove() 메서드의 [매개 변수]에는 삭제할 대상의 id가 아니라, Object가 들어 간다. 
public void delete(Member member){
    // JPA는 remove()라는 메서드를 제공하며,
    entityManager.remove(member);
}

 

이렇게 정리를 해두지 않으면 헷갈릴 것 같아 정리를 해둔다. 

여기서, 우리가 한 가지를 명심해 두자!!!!

JPA에서는 모~~~~~~~~든 게 해당 Transaction [내]에서 동작한다는 것이다.

-> 나는 remove(Object)를 보면서, "왜 id가 아니라, Object를 넣지?"라는 생각을 했다. 

그러나 이 의문은 "remove()"라는 JPA API는 특정 Transaction [내]에서 동작을 한다" 라는 것을 명심하면 납득이 간다.

일례로 아래의 코드를 봐 보자. 

@Test
@Transactional(readOnly = false) // JPA의 모든 것은 특정 Transaction [내]에서 실행됨. 
@Rollback(value = false)
public void basicCRUD(){
	
    //Transactino 시작!!!!!!!!!!!!!!
    Member member1 = new Member("member1");
    Member member2 = new Member("member2");
    repository.save(member1);
    repository.save(member2);

    //삭제 검증
    repository.delete(member1); // 삭제될 대상은 delete() 메서드(정확히는 repository::delete()에 있는
    repository.delete(member2);//remove(Object)라는 JPA API)가 속해 있는 Transaction 내에서 저장된 [객체]여야 한다. 

    long delete_count = repository.count();
    assertThat(delete_count).isEqualTo(2);
    //Transaction 끝!!!!!!!!!!!!!!
}

고로, 객체를 매개변수로 넣어, Context에 저장돼 있는 객체와 id값을 비교하여 삭제할 객체의 대상을 특정한다.