Post post1 = postRepository.findById(1L).get();// [**데이터베이스(DataBase)**](/vault/데이터베이스database) 조회 → 캐시 저장Post post2 = postRepository.findById(1L).get();// DB 조회 없이 캐시에서 반환System.out.println(post1 == post2);// true — 동일한 객체 (동일성 보장)
@TransactionalpublicvoidupdateTitle(Long id,String newTitle){Post post = postRepository.findById(id).get();// 영속 상태 post.setTitle(newTitle);// 변경 감지 등록// save() 없이도 트랜잭션 종료 시 UPDATE 쿼리 자동 실행}
@TransactionalpublicvoidsaveMultiple(){ em.persist(newPost("제목1"));// INSERT 쿼리 아직 안 나감 em.persist(newPost("제목2"));// INSERT 쿼리 아직 안 나감// 여기까지 DB 조회 없음 em.flush();// 또는 트랜잭션 커밋 → INSERT 2개 한꺼번에 전송}
# application.ymlspring:jpa:open-in-view:false# 실무 권장 설정
@Transactional// 트랜잭션 시작 = 영속성 컨텍스트 시작publicPostDtofindPost(Long id){Post post = postRepository.findById(id).get();// 영속 상태returnnewPostDto(post);// DTO 변환 후 반환}// 트랜잭션 종료 = 영속성 컨텍스트 종료 = 영속 → 준영속