-
카테고리
-
세부 분야
백엔드
-
해결 여부
미해결
PersistenceContext 관련 질문드립니다.
22.09.24 20:51 작성 조회수 165
0
안녕하세요 너무 좋은 강의 잘 듣고 있습니다.
두가지 질문이 있습니다.
PersistenceContext의 상태비교 관련입니다.
JPA2 JpaRepository.save() 메소드 강의를 시청하며, 따라하던 도중
첫번쨰 assertThat 부터 False 로 떨어져 왜이런지 모르겠습니다.
제가 이해한것과 강의내용에 따르면 당연히 True 가 놔와야 할텐데 이상하네요.
테스트는 @SpringBootTest 를 사용한 별도의 테스트클래스를 만들어 진행중이며,
PostRepository의 경우 아래와 같이 선언 하였습니다.
어떤 부분을 잘못이해하고 있거나 틀렸을까요 ?
public interface PostRepository extends JpaRepository<Post,Long>, QuerydslPredicateExecutor<Post>
@SpringBootTest
class DemoJpaApplicationTests {
@Autowired
private PostRepository postRepository;
@Autowired
private ApplicationContext applicationContext;
@PersistenceContext
private EntityManager entityManager;
@Test
void save(){
Post post = new Post();
post.setId(1L);
post.setTitle("JPA");
Post savePost = postRepository.save(post);
assertThat(entityManager.contains(post)).isTrue();
assertThat(entityManager.contains(savePost)).isTrue();
assertThat(savePost == post);
}
업데이트 쿼리가 안나갈 경우 어떤걸 봐야할까요 ?
updateTitle을 만들어 사용할땐 정상적으로 변경 됐지만
아래와 같이 코드를 작성하여 테스트 해보니 title에 Spring이 그대로 남아있어 테스트가 실패하네요.
private Post savePost(){
Post post = new Post();
post.setTitle("Srping");
return postRepository.save(post);
}
@Test
void updateTitle(){
Post spring = savePost();
spring.setTitle("hibernate");
Optional<Post> post = postRepository.findById(spring.getId());
assertThat(post.get().getTitle()).isEqualTo("hibernate");
}
답변을 작성해보세요.
0
백기선
지식공유자2022.10.12
답변이 늦어서 죄송합니다. 첫번째는 디버거를 사용해서, postRepository.save() 호출했을 때 EntityManager까지 가는지 확인해 봐야겠네요.
두번째는 post 객체에 setTitle()을 사용해서 객체를 변경했는데 왜 update 쿼리가 생기지 않느냐는 질문이신가요? 음.. 트랜잭션이 끝날 때 DB에 객체의 변경 사항을 동기화 시켜주기 때문인데요. 테스트 코드는 (트랜잭션으로 묶여있다는 가정하에) 지금 한 트랜잭션 내부에서 아직 트랜잭션이 끝나지 않은 상태에서 DB에서 (또는 1차 캐시에서) 다시 읽어오는 거니까 아직 변경 내역이 변영되지 않은 데이터가 읽어져서 그렇습니다.
답변 1