인프런 커뮤니티 질문&답변

wngus4278님의 프로필 이미지

작성한 질문수

실전! 스프링 데이터 JPA

스프링 데이터 JPA 구현체 분석

save에 관한 질문입니다.

작성

·

70

·

수정됨

0


[질문 내용]
강사님이 save를 할때는, 데이터가 디비에서 한번 갔다온(디비에서 조회된) 친구들은 수정시 save호출시 merge가 일어난다고 하셨는데,

 

영속성 컨텍스트에 그 조회한 데이터가 있으면, merge가 안 일어나지 않나욤?? 디비에서 데이터를 가져왔을 때, 해당 데이터의 변경이 일어나면, 그냥 트랜잭션이 끝날때, flush()가 일어나니까, 놔두면 알아서 더티체킹이 일어나서 업데이트가 되는 것으로 알고있습니다.

그래서, 한번 테스트로 데이터를 변경시키고, 해당 데이터를 save하니 디비에서 한번 더 select가 안 날라가더라고요. 이랬을땐, 아무것도 안 일어나는 건가여? 그리고 트랜잭션이 끝날때 더티체킹이 일어나서 업데이트가 되는 건가여? 영한님이 말하신 건, 영속성 컨텍스트에 해당 데이터를 clear했을 때를 말하는 건가여?

 

아래 사진 첨부입니다.

@Test
public void test(){
    Member member = memberRepository.findById(2L).orElseThrow();

    member.setUsername("ㅎㅎ");
    memberRepository.save(member);

}

 

zimage

 


@Test
public void test(){
    Member member = memberRepository.findById(2L).orElseThrow();

    member.setUsername("gg");
    em.flush();
    em.clear();
    memberRepository.save(member);


}
image.png

 

 

 

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. wngus4278님

데이터가 디비에서 한번 갔다온(디비에서 조회된) 친구들은 수정시 save호출시 merge가 일어난다고 하셨는데 -> 이 부분을 더 정확하게 이야기하면 트랜잭션 범위를 벗어난 엔티티를 뜻합니다.

쉽게 이야기해서 영속성 컨텍스트가 사라진 엔티티입니다.

따라서 생각하신 내용과 같습니다 🙂

감사합니다.

wngus4278님의 프로필 이미지
wngus4278
질문자

감사합니다!