이때까지
save()메서드는INSERT쿼리만 실행시켜주는 줄 알았는데
UPDATE쿼리도 수행 가능하다는 점, 그리고 트랜잭션 메서드 내에서 업데이트를 하기 위해save()를 호출하는 것이 필수는 아니라는 점을 알게 돼서 정리한 글.
save() 메서드는 INSERT 쿼리를 수행해서 데이터를 저장하는 역할을 함.INSERT쿼리를 실행함.save() 메서드가 UPDATE쿼리를 수행할까?UPDATE 쿼리를 실행함.INSERT
UPDATEpublic void update(MemberDTO memberDTO) {
memberRepository.save(MemberEntity.updateMemberEntity(memberDTO));
}

UPDATE쿼리가 실행되었음. @Transactional
public void update(MemberDTO memberDTO) {
Optional<MemberEntity> optionalMember = memberRepository.findById(memberDTO.getId());
if (optionalMember.isPresent()) {
MemberEntity member = optionalMember.get();
member.setMemberName(memberDTO.getMemberName());
member.setMemberPassword(memberDTO.getMemberPassword());
} else {
throw new IllegalArgumentException("회원이 존재하지 않음.");
}
}

save()메서드가 없었음에도 불구하고 UPDATE쿼리가 실행된 것을 확인할 수 있음.@Transactional에노테이션은 필수임.@Transactional에노테이션이 없다면 데이터가 변하지 않음.JPA의 영속성 컨텍스트 때문임.
영속성 컨텍스트란?
특징.
EntityManager와 영속성 컨텍스트
만약 엔터티가 변경될 때마다 즉시 데이터베이스와 동기화된다면, 데이터베이스 호출이 지나치게 많아져 성능이 저하될 것이고 영속성 컨텍스트는 이를 방지하는 역할을 함.
확장 범위 영속성 컨텍스트는 Stateless Session Bean에서 사용될 때, 각 컴포넌트의 영속성 컨텍스트가 서로 독립적임.Ex) Component A에서 한 엔터티를 영속화했다면, 같은 트랜잭션 내의 Component B에서는 해당 엔터티를 조회할 수 없음.