inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 데이터 JPA

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

304

ko

작성한 질문수 7

0

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

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

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

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

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

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

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

java spring spring-boot jpa

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 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에 바로 업데이트됩니다.

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

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

0

72

1

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

0

107

3

MemberRepository 구현체

0

58

1

pdf 표현 질문드립니다.

0

62

1

로그가 남지 않는 문제.

0

81

1

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

0

72

2

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

0

73

2

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

0

91

2

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

0

52

1

스캔대상 질문드립니다.

0

46

1

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

0

86

1

save() vs saveAndFlush DB 통신 횟수

0

54

1

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

0

86

2

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

0

152

3

bulk insert 질문입니다.

0

178

2

교만했던 것 같아요.

0

147

1

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

0

148

2

동적 테이블에 대한 질문

0

86

1

영속성 전이와 연관관계

0

131

2

강의 10:25 질문

0

74

1

단건 update 질문

0

96

2

엔티티 와 도메인의 경계

0

127

1

UsernameOnlyDto 타입 type mismatch 오류

0

120

1

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

0

136

1