inflearn logo
강의

Course

Instructor

Practical! Spring Data JPA

JPA Dirty Checking - open session in view

845

suhani93

8 asked

0

안녕하세요
JPA Dirty Checking 관련 질문 드립니다.
 
우선 환경은 Spring Boot 입니다.
 
	public void test() {
		OrderInfo orderInfo = new OrderInfo();
		orderInfo.setStatus("test");
		oRepo.save(orderInfo);
		
		OrderInfo findOrderInfo = oRepo.findById(orderInfo.getId()).get();
		findOrderInfo.setStatus("zzzzzzz");
	}

위와 같은 코드가 있다고 할 때

Open session In view 설정과 @Transactional 에 따라서 dirty checking 되는 로직에 대해서 질문드립니다.

 

1.

Open Session in View : true

@Transactional : 사용 안함

Hibernate: call next value for hibernate_sequence
Hibernate: insert into order_info (status, id) values (?, ?)
Hibernate: select orderinfo0_.id as id1_0_0_, orderinfo0_.status as status2_0_0_ from order_info orderinfo0_ where orderinfo0_.id=?

 

2.

Open Session in View : false

 @Transactional : 사용 안함

Hibernate: call next value for hibernate_sequence
Hibernate: insert into order_info (status, id) values (?, ?)

 

3. 

Open Session in View : true

 @Transactional : 사용

Hibernate: call next value for hibernate_sequence
Hibernate: insert into order_info (status, id) values (?, ?)
Hibernate: update order_info set status=? where id=?

 

4. 

Open Session in View : false

 @Transactional : 사용 

Hibernate: call next value for hibernate_sequence
Hibernate: insert into order_info (status, id) values (?, ?)
Hibernate: update order_info set status=? where id=?

 

1 번의 경우 영속성 컨텍스트가 각각의 트랜잭션에서 끝나서 select 문이 나가는 것으로 보입니다.

2번의 경우 OSIV로 인해 영속성 컨텍스트가 끝까지 남아서 select문이 안나가는 것으로 보입니다. 

3번의 경우도 OSIV와 Transaction으로 인해 영속성 컨텍스트안에 있는 객체를 가져오기에 select 문이 안나가는 것으로 보입니다. 그 후 dirty checking 으로 인해 update 문이 발생합니다.

4번의 경우 트랜잭션 범위내에 있는 영속성 컨텍스트에서 찾아오기에 select문이 안나가는 것으로 보입니다. 그 후 dirty checking 으로 인해 update 문이 발생합니다.

 

dirty checking 의 경우 영속성 컨텍스트가 관리하고 있는 엔티티에 대해서 스냅샷을 저장 후 변경이 되면 나가는 것으로 알고 있습니다.

 

그럼 이 때 2번의 경우 영속성 컨텍스트가 남아서 select문이 안나간다고 생각을 하는데 왜 dirty checking 이 안되는 이유가 있을까요??

 

 

jpa spring spring-boot java JPA

Answer 2

0

suhani93

영속성 컨텍스트 기준으로 나가는 줄 알았는데 트랜잭션이 끝났을 때 그때 비교를 하고 동작을 하네요.

감사합니다.

0

David

안녕하세요. suhani93님, 공식 서포터즈 David입니다.

@Transactional을 사용하지 않았기 때문에 변경감지가 동작하지 않습니다.

감사합니다.

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

0

67

1

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

0

105

3

MemberRepository 구현체

0

56

1

pdf 표현 질문드립니다.

0

60

1

로그가 남지 않는 문제.

0

79

1

테스트 라이브러리가 강의는 junit4가 맞나요??

0

70

2

pdf 파일과 차이점이 있는 것같은데 문제 없나요?

0

71

2

@PrePersist, @PreUpdate 호출 시점 질문드립니다.

0

91

2

Sort 인터페이스는 잘 사용 안하나요?

0

52

1

스캔대상 질문드립니다.

0

45

1

하이버네이트6에서의 최적화에 이은 질문

0

82

1

save() vs saveAndFlush DB 통신 횟수

0

52

1

순수 JPA 리포지토리 코드 수정부분

0

86

2

bulk연산 후 flush하는 이유를 모르겠어요

0

150

3

bulk insert 질문입니다.

0

176

2

교만했던 것 같아요.

0

145

1

RESTful 강의는 안하시는 건지 궁금합니다.

0

145

2

동적 테이블에 대한 질문

0

85

1

영속성 전이와 연관관계

0

130

2

강의 10:25 질문

0

73

1

단건 update 질문

0

95

2

엔티티 와 도메인의 경계

0

126

1

UsernameOnlyDto 타입 type mismatch 오류

0

119

1

Projection 개념과 데이터 전달과정에 대해 질문 있습니다.

0

136

1