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

ko님의 프로필 이미지
ko

작성한 질문수

실전! 스프링 데이터 JPA

영속성 컨텍스트와 데이터 베이스 동기화

작성

·

242

0

안녕하세요 공부를 하던 중에 궁금한 점이 생겼습니다.

제가 간단한 회원정보를 스프링 데이터 jpa로 저장을 했는데 그 후에

db에서 직접 값을 바꾸고 조회하니 당연히 영속성 컨텍스트에 있는 부분과 동기화가 안되어

원하는 값이 조회가 안됐습니다.

이런 경우에 바뀐 값을 조회하려면 memberservice 혹은

JpaRepostory를 상속받은 memberRepository에서 영속성 컨텍스트를 clear로

한 번 지워야 할 것 같은데 어떻게 해야 할지 잘 모르겠습니다.

답변 1

0

안녕하세요, 인프런 AI 인턴이에요.

영속성 컨텍스트와 데이터베이스 동기화에 대한 문제는 매우 흔한 문제입니다.
영속성 컨텍스트는 엔티티들을 관리하는 영역이며 한번 저장된 엔티티는 메모리상에 존재하므로 DB에서 직접 바뀐 내용은 영속성 컨텍스트에 반영되지 않습니다.

해결 방법은 크게 두 가지가 있습니다.
첫 번째는 영속성 컨텍스트를 clear() 혹은 detach() 메소드를 이용하여 영속성 컨텍스트를 초기화해주는 방법입니다.
두 번째는 JPA에서 제공하는 @Modifying 어노테이션을 이용하여 DB에 바로 업데이트를 해주는 방법입니다.

첫 번째 방법은 영속성 컨텍스트를 초기화하면 모든 엔티티의 상태가 수정된 것으로 간주되므로 주의해야 합니다.
다음은 clear() 혹은 detach() 메소드를 이용한 초기화 방법입니다.

예시 코드)
@Repository
public class MemberRepository {
@PersistenceContext
private EntityManager entityManager;

public Member findMemberById(Long memberId) {
    // clear() 메소드를 이용한 초기화
    entityManager.clear();
    return entityManager.find(Member.class, memberId);
}

}

두 번째 방법은 @Modifying 어노테이션을 이용하면 DB에서 바로 업데이트가 가능합니다.
예시 코드)
@Repository
public class MemberRepository {
@PersistenceContext
private EntityManager entityManager;

@Modifying
@Query("UPDATE Member m SET m.age = :age WHERE m.id = :memberId")
public void updateAge(@Param("age") int age, @Param("memberId") Long memberId);

}

이렇게 @Modifying 어노테이션을 사용하면 entityManager.flush()를 호출하지 않아도 DB에 바로 업데이트됩니다.

이상입니다. 추가적으로 궁금한 점이 있다면 언제든지 댓글로 질문해주세요!

ko님의 프로필 이미지
ko

작성한 질문수

질문하기