CS 잡지식
JPA가 제공하는 remove() 메서드에 대한 주의!!
JIN_YOUNG _KIM
2023. 5. 10. 14:29
//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값을 비교하여 삭제할 객체의 대상을 특정한다.