• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

PersistenceContext 관련 질문드립니다.

22.09.24 20:51 작성 조회수 165

0

안녕하세요 너무 좋은 강의 잘 듣고 있습니다.

두가지 질문이 있습니다.

 

  1. 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);
}

 

  1. 업데이트 쿼리가 안나갈 경우 어떤걸 봐야할까요 ?

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");
}

답변 1

답변을 작성해보세요.

0

답변이 늦어서 죄송합니다. 첫번째는 디버거를 사용해서, postRepository.save() 호출했을 때 EntityManager까지 가는지 확인해 봐야겠네요.

두번째는 post 객체에 setTitle()을 사용해서 객체를 변경했는데 왜 update 쿼리가 생기지 않느냐는 질문이신가요? 음.. 트랜잭션이 끝날 때 DB에 객체의 변경 사항을 동기화 시켜주기 때문인데요. 테스트 코드는 (트랜잭션으로 묶여있다는 가정하에) 지금 한 트랜잭션 내부에서 아직 트랜잭션이 끝나지 않은 상태에서 DB에서 (또는 1차 캐시에서) 다시 읽어오는 거니까 아직 변경 내역이 변영되지 않은 데이터가 읽어져서 그렇습니다.