인프런 커뮤니티 질문&답변

suhani93님의 프로필 이미지
suhani93

작성한 질문수

실전! 스프링 데이터 JPA

JPA Dirty Checking - open session in view

작성

·

739

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 이 안되는 이유가 있을까요??

 

 

답변 2

0

suhani93님의 프로필 이미지
suhani93
질문자

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

감사합니다.

0

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

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

감사합니다.

suhani93님의 프로필 이미지
suhani93

작성한 질문수

질문하기