영속성 컨텍스트 이슈가 발생하는 이유는 '동일성' 때문에 발생합니다.
- 수정 혹은 생성은 주의
- @Transactional 의 경우에 모든 메서드가 끝나는 시점에 영속성 컨텍스트가 DB에 반영
- JPA 조회를 하면 DB 쿼리 조회보다 영속성 컨텍스트에서 먼저 조회
- save ( ) 는 DB 저장이 아닌 영속성 컨텍스트에 저장
@Entity
@NoArgsConstructor
@Data
@ToString(callSuper = true)
@DynamicInsert //여기도 집중하자~~~
@EqualsAndHashCode(callSuper = true)
public class Comment extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String comment;
@ManyToOne
@ToString.Exclude
private Review review;
@Column(columnDefinition = "datetime") // 집중!!!!!!!!!!!!!!!!!!!!!!!!//
private LocalDateTime commentedAt;
}
public interface CommentRepository extends JpaRepository<Comment,Long> {
}
간단하게 선언해준다.
@DisplayName("1. commentTest ")
@Test
@Transactional
void test_1(){
Comment comment = new Comment();
comment.setComment("별로....");
comment.setCommentedAt(LocalDateTime.now());
commentRepository.save(comment);
commentRepository.findAll().forEach(System.out::println);
}
간단하게 해보자 실행 시켜본다.
id=4, comment=별로...., commentedAt=2022-08-08T16:55:03.005
위와 같은 결과가 나온다. 근데 만약
@DisplayName("1. commentTest ")
@Test
@Transactional
void test_1(){
Comment comment = new Comment();
comment.setComment("별로....");
comment.setCommentedAt(LocalDateTime.now());
commentRepository.save(comment);
entityManager.clear(); // 짜짠!
commentRepository.findAll().forEach(System.out::println);
}
clear ( ) 를 시켜서 캐시를 지워준다면??
id=4, comment=별로...., commentedAt=2022-08-08T16:57:14
결과가 다르게 나오는것을 볼 수 있다.
아주 사소한 차이긴 하지만 나중에는 영속성 컨텍스트의 캐시 문제로 데이터가 잘 내려오지 않거나 다르게 내려온다면
골치가 아파진다...
일단 이 문제는 더 겪어보고 내가 원하는대로 데이터가 내려오지않을때 해봐야할것같다.
나중에 추가로 진행해보겠습니다.