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

HappyJay님의 프로필 이미지
HappyJay

작성한 질문수

실전! 스프링 데이터 JPA

순수 JPA 기반 리포지토리 만들기

영속성 컨텍스트 관련 질문입니다.

작성

·

258

1

매번 수준 높은 강의에 감사 드리고 열심히 공부하고 있습니다!!

그런 의미에서 질문이 있는데요, 

1. 만약 MemberJpaRepositoryTest 에서

아래처럼 EntityManager 를 또 주입 받았을 경우 

기존에 MemberJpaRepository 에서의 EntityManager 와

Test에서의 EntityManager 가 같은 영속성 컨텍스트를 바라보고 있는 건가요?

2. flush 이후에 clear 를 통해서 영속성 컨텍스트를 비우고

엔티티의 값을 변경하면, 1차 캐시에 객체가 없어서 변경감지가 일어나지 않기 때문에 update 가 발생하지 않는게 맞나요?

3. 그러면 혹시 2번에서 발생한 변경사항을 db에 반영할 수 있는 방법은 없을까요? 아니면 1차 캐시에 존재하지 않는 객체의 속성을 변경하려고 할 경우 에러를 낸다던지 하는 건 없을까요?

class MemberJpaRepositoryTest {

@PersistenceContext
EntityManager newEm;

@Autowired MemberJpaRepository memberJpaRepository;

@Test
public void basicCRUD() {
Member member1 = new Member("member1");
Member member2 = new Member("member2");
memberJpaRepository.save(member1);
memberJpaRepository.save(member2);

newEm.flush();
newEm.clear();

member1.setMemberName("newMember1");
}
}

답변 2

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. HappyJays님

1. 만약 MemberJpaRepositoryTest 에서

아래처럼 EntityManager 를 또 주입 받았을 경우 

기존에 MemberJpaRepository 에서의 EntityManager 와

Test에서의 EntityManager 가 같은 영속성 컨텍스트를 바라보고 있는 건가요?

같은 트랜잭션 안에서는 같은 영속성 컨텍스트에 접근합니다. 트랜잭션이 다르면 다른 영속성 컨텍스트에 접근하게 됩니다.

해당 테스트 케이스에 트랜잭션이 설정되어 있다고 가정한다면 같은 영속성 컨텍스트에 접근하게 됩니다.

2. flush 이후에 clear 를 통해서 영속성 컨텍스트를 비우고

엔티티의 값을 변경하면, 1차 캐시에 객체가 없어서 변경감지가 일어나지 않기 때문에 update 가 발생하지 않는게 맞나요?

네 맞습니다.

3. 그러면 혹시 2번에서 발생한 변경사항을 db에 반영할 수 있는 방법은 없을까요? 아니면 1차 캐시에 존재하지 않는 객체의 속성을 변경하려고 할 경우 에러를 낸다던지 하는 건 없을까요?

준영속 상태의 객체를 다시 영속 상태로 만들려면 em.merge()를 호출하시면 됩니다. 이렇게 하면 변경한 데이터도 함께 반영됩니다.

감사합니다.

0

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

답변 주신 내용 중에 트랜잭션 관련해서 질문이 하나 더 있습니다.

아래처럼 각각 @Transactional 이 붙어있는 함수에 대해서

호출관계가 있을 경우

2개 함수는 같은 트랜잭션으로 묶이는건가요? 아니면 서로 다른 트랜잭션으로 처리되는 건가요?

@Transactional
public void A() {
B();
}

@Transactional
public void B() {
}

김영한님의 프로필 이미지
김영한
지식공유자

네 같은 트랜잭션을 사용합니다.

HappyJay님의 프로필 이미지
HappyJay

작성한 질문수

질문하기