[SPRING] JPA - Persistence Aware Issue

RuiN·2022년 8월 8일
0

Spring

목록 보기
8/8
post-thumbnail

영속성 컨텍스트 이슈가 발생하는 이유는 '동일성' 때문에 발생합니다.

  • 수정 혹은 생성은 주의
  • @Transactional 의 경우에 모든 메서드가 끝나는 시점에 영속성 컨텍스트가 DB에 반영
  • JPA 조회를 하면 DB 쿼리 조회보다 영속성 컨텍스트에서 먼저 조회
  • save ( ) 는 DB 저장이 아닌 영속성 컨텍스트에 저장

Entity

@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;

}
  • comment 라는 Entity를 만들어준다.
    • 집중해야할 부분은 commentedAt 이다.
  • @Column 어노테이션으로 datetime 을 명시해준다

JPA Repo

public interface CommentRepository extends JpaRepository<Comment,Long> {
}

간단하게 선언해준다.


Test

    @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

결과가 다르게 나오는것을 볼 수 있다.
아주 사소한 차이긴 하지만 나중에는 영속성 컨텍스트의 캐시 문제로 데이터가 잘 내려오지 않거나 다르게 내려온다면
골치가 아파진다...


+@

일단 이 문제는 더 겪어보고 내가 원하는대로 데이터가 내려오지않을때 해봐야할것같다.

나중에 추가로 진행해보겠습니다.

profile
어디까지 올라갈지 궁금한 하루

0개의 댓글